我开发了一个2D射击游戏,其中包含许多对象和激进的滚动。

问题:哪种方法更好?

选择1-使用本机Flash渲染:

  • 从位图派生游戏对象,使用现有的x,y,宽度,高度,位图数据
  • 将所有对象作为子代UIComponent.addChild(...)添加到
  • 使用“scrollRect”剪辑可见区域

  • 选择2-使用“位图+ copyPixels”编写自定义渲染
  • 将自己的游戏对象与x,y,宽度,高度,位图一起使用
  • 将位图添加到屏幕,从中获取bitmapData
  • 重绘每个ENTER_FRAME:bitmapData.lock(),遍历游戏对象并将copyPixels()转换为bitmapData,然后将bitmapData.unlock()转换为
  • 自定义裁剪:不渲染屏幕外对象

  • 在此question中,有些人抱怨“位图+ copyPixels()”很慢。

    实验:我已经实现了两种技术:
  • main_1.swf-本地
  • main_2.swf-自定义

  • 请尝试一下,告诉哪个更好(更快,更流畅,吃更少的CPU)。

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

    更新2:我更改了代码,现在蠕变的生成速度更快。

    最佳答案

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

    既然接受了这一点,我将添加一条注释,以使我在注释中的回答更清楚:如果您的所有 Assets 本身都是位图,那么正如HanClinto所指出的那样,发现手动合成它们的速度会比原来快就不足为奇了。制作本机对象并让Flash完成工作,因为它消除了与显示对象(如事件结构)相关的开销。

    但是,在某些情况下,手动处理可能会胜出,例如,如果您需要将 vector 内容渲染到位图中,或者需要绘制许多动画精灵,或者您需要检测 Actor 上的鼠标事件(如果您自己进行合成,则需要手动进行,也许很痛苦)。

    因此,如果您不需要做任何会减慢手动合成的操作,那么它肯定是最好的答案,如果您这样做,则尝试两种方法都是绝对可以肯定的最佳方法。 (也可以使用混合模型,在该模型中,您需要制作一层需要鼠标事件的本机对象,并用一层人工合成的位图对其进行叠加或覆盖。)

    关于flash - 游戏开发人员的Flash性能:原生渲染与BitmapData帧缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1018074/

    10-11 12:16