如何摆脱大量敌人实例造成的滞后?

时间:2011-11-01 10:27:17

标签: actionscript-3 optimization

我正在制作一个闪光射击游戏,我遇到了一个问题。当舞台上有许多怪物被玩家看到时,游戏开始滞后。在我看来,它是由于Event.ENTER_FRAME(每个敌人的实例都有它),其中z-sorting,敌人运动,更新其他类似健康的东西。由于像theese这样的东西,不能每秒或以相似的时间间隔完成,我使用ENTER_FRAME。我的问题是,我怎么能在我的游戏中有很多敌人的实例,但仍然没有落后。我已经在所有代码中进行了优化,如果我没有弄错的话,大量的敌人就是这里的性能瓶颈。

如果我不清楚,请问我;看到游戏转到http://ernyz.lhosting.info/bandymas.html或者如果你想看到代码,我可以把它放在这里,只要问:)

2 个答案:

答案 0 :(得分:5)

每个实例都有一个输入框架事件很可能是问题所在。您遍历所有实例并执行操作的单个事件通常会更快。

你应该没有多少改变:不是向每个敌人添加监听器,而是只向舞台添加一个监听器并调用敌人的更新功能。

class Enemy {
    function update(e:Event) { /* ... */ }
}

class Main {
    function onEnterFrame(e:Event) {
        for each (var enemy:Enemy in enemies) {
            enemy.update(e);
        }
    }
}

答案 1 :(得分:1)

根据我的经验,除非你做了一些非常错误的事情,否则Flash渲染管道将占用您应用程序的大部分时间。而且,由于你获得了更多的敌人,你会得到更多的MovieClip和更复杂的渲染。

但是为每个对象设置一个ENTER_FRAME事件确实是一个很容易避免的大开销。

优化代码之前的一个好习惯是通过分析器实际运行它。我不相信实际的Flash程序有它,但Flash Builder肯定会这样做。如果您向我们发布截图或正在分析的游戏日志,我们可以提供更多帮助。

通过快速玩游戏,我发现你所有的敌人都是一堆带有一堆渐变的图形,因此渲染成本很高。您是否尝试过将质量设置为低?滞后会消失吗?