游戏开发的Flash性能:本机渲染VS BitmapData帧缓冲

osh*_*hko 20 flash performance actionscript-3

我开发了一个2D射击游戏,有很多物体积极的滚动.

问题:哪种方式更好?

选择1 - 使用原生Flash渲染:

  • 从Bitmap派生游戏对象,使用现有的x,y,width,height,bitmapData
  • 将所有对象作为子UIComponent.addChild(...)添加到sccreen
  • 使用"scrollRect"剪辑可见区域

选择2 - 使用"bitmap + copyPixels"编写自定义渲染

  • 使用自己的游戏对象x,y,width,height,bitmapData
  • 将Bitmap添加到屏幕,从中获取bitmapData
  • 重新绘制每个ENTER_FRAME:bitmapData.lock(),迭代游戏对象和copyPixels()到bitmapData,然后bitmapData.unlock()
  • 自定义剪裁:不渲染屏幕对象

在这个问题中有人抱怨"bitmap + copyPixels()"很慢.

实验:我已经实现了两种技术:

请尝试一下,告诉哪一个更好(更快,更顺畅,占用更少的CPU).

等到至少有250个敌人(屏幕上方的计数器).
更新:尝试打开任务管理器(或$ top)并查看总体CPU使用情况

更新2:我已经更改了代码,现在更快地生成了.

fen*_*mas 4

更新:感谢高压力版本。再说一次,我只是跑来跑去,看不出有什么区别。但我巧妙地发现“r”会掉落炮塔,当我掉落20-30个炮塔时,原生版本比手动版本慢一些,所以也许我错了。(我发现内存使用情况没有差异。)看起来本地处理事情应该有可能更快,但很可能需要对某些不透明的排序进行专门处理。

由于这一点已被接受,我将添加一条注释以明确我在对另一个答案的评论中所说的话:如果您的所有资产本身都是位图,那么正如 HanClinto 指出的那样,发现手动合成它们比手动合成它们更快就不足为奇了制作本机对象并让 Flash 完成工作,因为它消除了与显示对象(如事件结构)相关的开销。

然而,在某些情况下,手动执行操作可能会胜出,例如,如果您有需要渲染为位图的矢量内容,或大量动画精灵,或者如果您需要检测演员上的鼠标事件(您需要需要手动完成,如果您自己进行合成,可能会很痛苦)。

因此,如果您不需要做任何会减慢手动合成速度的事情,那么它似乎绝对是最好的答案,如果您这样做,那么尝试这两种方法是绝对确定的最佳方法。(混合模型也是可能的,您可以制作一层需要鼠标事件的本机对象,并用一层手动合成的位图覆盖或底层。)