2

我有一个游戏,当玩家探索时会产生新的地形块,以允许看似无限的关卡大小。它一直运行良好,但我决定让我的角色向一个方向移动很长时间,最终它得到了这个错误:

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/

(控制是 WASD 移动,按住 shift 移动更快。)

每个“块”是游戏屏幕本身的大小,每个块存储组成它BitmapData的所有较小BitmapDatas 的缓存(草、树、岩石、花等的瓦片)。块BitmapData被加载到Bitmap一个当块足够接近最终需要渲染的阶段时的阶段。

编辑2:

我上传了一张图片来说明我认为 Amy 为我的游戏提出的不需要存储许多 BitmapData 对象的渲染方法:

在此处输入图像描述

四个角落的彩色区域是BitmapData将被绘制到Bitmap屏幕上的对象(与用户的屏幕大小相同,以绿色表示)。整个事物周围的黑色区域表示在某一点可能是其他BitmapData对象设置为,null因为它们不再需要。

Bitmap随着玩家的移动,4 个角的 BitmapData 对象将用新的点坐标重新绘制到主坐标。

4

1 回答 1

1

我无法重现您的错误。

我直接向北跑了大约 5 分钟,内存消耗增长到 3+GiB,然后我用完了 RAM,所以它开始使用交换并且变得非常慢。

所以,我猜你只是内存不足,而闪存的错误对于这种情况来说有点奇怪。尝试释放旧的位图,或者甚至更好地重用它。推荐的方法通常是始终拥有 4 个屏幕大小的位图,当您向东走时,将西部的位图重新用于东部的新区域,反之亦然,北部和南部也是如此。

另外,我看到一条非常烦人的闪烁白色条纹。我不知道这是否真的是原因,但它通常发生在有人不使用双缓冲时。

于 2012-07-10T10:50:40.750 回答