我开发了一款 2D 射击游戏很多物体 and 激进的滚动.
问题:哪种方式更好?
选择 1 - 使用原生 Flash 渲染:
- 从 Bitmap 派生游戏对象,使用现有的 x、y、宽度、高度、bitmapData
- 将所有对象添加为子 UI Component.add Child(...) 到屏幕
- 使用“scrollRect”剪辑可见区域
选择 2 - 使用“位图 + copyPixels”编写自定义渲染
- 使用自己的游戏对象与 x、y、宽度、高度、位图数据
- 将位图添加到屏幕,从中获取位图数据
- 重绘每个 ENTER_FRAME:bitmapData.lock(),迭代游戏对象并 copyPixels() 到 bitmapData,然后 bitmapData.unlock()
- 自定义剪辑:不渲染屏幕对象
这里在这个question https://stackoverflow.com/questions/989471/vsync-in-flex-flash-as3有些人抱怨“bitmap + copyPixels()”很慢。
实验:我已经实现了这两种技术:
-
main_1.swf http://sites.google.com/site/oshyshko/framebuffer_vs_nativerender/main_1_more_creeps.swf?attredirects=0- 本国的
-
main_2.swf http://sites.google.com/site/oshyshko/framebuffer_vs_nativerender/main_2_more_creeps.swf?attredirects=0- 风俗
请尝试一下,看看哪一个更好(更快、更流畅、占用 CPU 更少)。
等到会有至少 250 个敌人(屏幕上方的计数器)。
UPDATE:尝试打开任务管理器(或 $top)并查看总体 CPU 使用情况
更新2:我更改了代码,现在小兵的生成速度更快了。
更新:感谢高压力版本。再说一遍,我只是跑来跑去,看不出有什么区别。但我巧妙地发现“r”会掉落炮塔,当我掉落20-30个炮塔时,原生版本比手动版本慢一些,所以也许我错了。 (我发现内存使用情况没有差异。)看起来本地处理事情应该有可能更快,但很可能需要对某些不透明的排序进行专门处理。
由于这一点已被接受,我将添加一条注释以明确我在对另一个答案的评论中所说的话:如果您的所有资产本身都是位图,那么正如 HanClinto 指出的那样,发现手动合成它们比手动合成它们更快也就不足为奇了。制作本机对象并让 Flash 完成工作,因为它消除了与显示对象(如事件结构)相关的开销。
然而,在某些情况下,手动执行操作可能会胜出,例如,如果您有需要渲染为位图的矢量内容,或大量动画精灵,或者如果您需要检测演员上的鼠标事件(您需要需要手动完成,如果您自己进行合成,可能会很痛苦)。
因此,如果您不需要做任何会减慢手动合成速度的事情,那么它似乎绝对是最好的答案,如果您这样做,那么尝试这两种方法是绝对确定的最佳方法。 (混合模型也是可能的,您可以制作一层需要鼠标事件的本机对象,并用一层手动合成的位图覆盖或底层。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)