【问题标题】:How to get rid of lag caused by lots of enemy instances?如何摆脱大量敌人实例造成的延迟?
【发布时间】:2011-11-01 10:27:17
【问题描述】:

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

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

【问题讨论】:

  • 你应该发布一些代码。可能有一些简单的优化。还有,有多少敌人是“多”?
  • 嗯,每个房间有 10 个活跃的敌人让这个游戏滞后,所以我认为,这可以算作很多。活跃的是那些与玩家在同一个房间里,其他人“睡觉”并且什么都不做的人。这是整个敌人类sendspace.com/file/iqztfp>
  • var penis:Number = 0; ... 什么?
  • 哎呀,当我心情不好时,我会用愚蠢的变量名来振作起来,忽略它:D
  • 为什么不能每秒更新一次?您可以创建一个计时器并在它触发时执行您的更新代码。

标签: actionscript-3 optimization


【解决方案1】:

每个实例都有一个输入帧事件很可能是问题所在。循环所有实例并执行操作的单个事件通常更快。

你不应该有太多的改变:不要为每个敌人添加监听器,而是在舞台上只添加一个监听器并调用敌人的更新函数。

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

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

【讨论】:

  • 谢谢,我尽快试试看:)
  • 好吧,我已经按照你说的做了,但游戏仍然滞后。尽管如此,你提供的更新敌人还是很糟糕:)
【解决方案2】:

根据我的经验,除非您做错了什么,否则 Flash 渲染管道会占用您的应用程序最多的时间。而且,由于您遇到更多敌人,因此您会获得更多影片剪辑和更复杂的渲染。

但是为每个对象设置一个 ENTER_FRAME 事件确实是一个很大的开销,可以轻松避免。

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

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

【讨论】:

  • 我不知道什么是分析器,但我有更多空闲时间后会立即查看它,因为这些天我有点忙,如果一切正常,我会发布你所问的内容 :)是的,我只是尝试在质量设置为低的情况下玩游戏,并且运行流畅。我想稍微降低质量会是一件好事,谢谢!
  • 分析器是一种工具,它可以计算代码的每个部分运行时间,因此它可以测量占用计算机时间最多的部分。如果您降低质量并且运行平稳,则问题可能与图形有关。一个想法是不要为你的敌人使用图形,而是将它们全部转换为位图,这应该会有很大帮助,因为你有这么多的图形和这么多的渐变(渐变和 alpha 混合需要大量的计算时间)。
  • 要测试一下,用位图占位符替换你的整个敌人,看看它的表现如何。
  • 好吧,我已经用位图替换了所有图形,这很有帮助,非常感谢您的帮助:)
  • 很高兴我能提供帮助,请考虑接受我的回答或投票:D。
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多