我有一个游戏,当玩家探索时,它会产生新的地形块,以允许似乎无限的关卡大小。它一直工作得很好,但我决定让我的角色在一个方向上移动很长一段时间,最终它得到了这个错误:
ArgumentError: Error #2015: Invalid BitmapData.
at flash.display::BitmapData/ctor()
at flash.display::BitmapData()在这一行代码中:
this.new_chunk.background_bitmap_data = new BitmapData(this.level_obj.block_size * this.new_chunk.blocks_wide + this.level_obj.oversize_bmd_offset,this.level_obj.block_size * this.new_chunk.blocks_tall + this.level_obj.oversize_bmd_offset,true,0x00000000);我在提供用于创建位图数据的宽度和高度值的变量/方程上运行了一个trace();,它不断地输出相同的值,正如预期的那样:
2150 1300我在许多不同的方向上运行我的角色,无论方向如何,最终都会发生同样的事情。我知道BitmapData不会变得太大,因为它总是2150x1300。
注意:在一个小区域内不会发生错误,无论我让游戏运行多长时间,错误只会在一个方向上移动很长时间后才会发生,从而产生大量新的关卡块。
你知道为什么flash会抛出这个错误吗?
编辑:
这是这个游戏的现场演示,这样你就可以更好地了解发生了什么:http://test.webskethio.com/boxy/
(用于移动的控件为W.A.S.D,按住shift可更快地移动。)
每个“块”是游戏屏幕本身的大小,每个块存储组成它的所有较小BitmapData的缓存BitmapData (草、树、岩石、花等的瓦片)。当块与舞台足够近时,块BitmapData将加载到舞台上的Bitmap中,最终可能需要渲染它。
编辑2:
我上传了一张图片来说明我认为艾米为我的游戏提出的渲染方法,它不需要存储许多BitmapData对象:

四个角彩色区域是将绘制到屏幕上的一个Bitmap的BitmapData对象(与用户屏幕的大小相同,以绿色表示)。整个事物周围的黑色区域表示在某一点上可能是其他BitmapData对象的东西,这些对象已经被设置为null,因为它们不再需要。
随着玩家的移动,4个角BitmapData对象将被重新绘制到具有新的点坐标的主Bitmap中。
发布于 2012-07-10 18:50:41
我无法重现你的错误。
我带着shift一直往北跑了大约5分钟,内存消耗增长到3+GiB,然后我离开了内存,所以它开始使用交换空间,变得非常慢。
所以,我猜你只是耗尽了内存,而flash的错误对于这种情况来说有点奇怪。尝试释放旧的位图,或者更好地重用它。推荐的方法通常是在任何时候都有4个屏幕大小的位图,当你向东移动时,对东部的新区域重复使用西部的位图,反之亦然,对北部和南部也是如此。
此外,我还看到一个非常烦人的闪烁的白色条纹。我不知道这是否是真正的原因,但它通常发生在有人没有使用双缓冲时。
https://stackoverflow.com/questions/11404908
复制相似问题