AS3大型游戏性能随着时间的推移而降级

Kai*_*Kai 9 apache-flex performance memory-leaks actionscript-3

我目前正在制作一个非常大的Flash平台游戏(数百个课程),并处理一个问题,如果你让它停留足够长的话,游戏会慢慢停止.我没有写游戏,所以我只是模糊地熟悉它的内部.一些神秘的症状包括,

  • 游戏将在确定的时间内(在给定的级别上)正常运行,突然间它会以指数方式开始泄漏内存.
  • 当屏幕上有更多精灵时,游戏达到指数级泄漏的时间缩短了.
  • 即使没有任何东西可见地呈现在屏幕上,游戏也会变慢.
  • 随着更频繁的精灵碰撞,游戏速度变慢.
  • 完全禁用冲突代码确实可以减缓降级,但不会阻止游戏最终丢帧.

查看源代码并使用Flex Profiler,我的主要嫌疑人是,

  • 有许多游荡的物体,特别是WeakMethodClosure占用大量的记忆.
  • 该程序非常广泛地使用弱事件侦听器(每帧调度数十个).
  • 每次创建新的精灵时都会复制BitmapData.这些是50x50像素精灵,每秒产生约8个精灵.

我知道在没有看到源的情况下几乎无法告诉我这个问题,所以我只是在寻找可以帮助我缩小范围的花絮.有没有人在他们自己的项目中经历过这种规避性能下降?你的案子是什么原因?

pek*_*eko 7

我最近完成了一个大型项目的优化.我可以给你一些建筑建议:

  1. 主要原则 - 尝试尽可能少的函数/事件调用
  2. 除了一个 onEnterFrame/onInterval/onTimer周期之外,除去一个.你在需要的一切一个普通事件的呼叫.您可能需要大量静态数组来存储已处理的对象引用.
  3. 你的图形/渲染内容也在一个主循环中
  4. 尝试使用大(可能是预呈现的)画布而不是小精灵/位图.通常它可用于背景.但也适用于较小的物体(如树木,平台等)
  5. 摆脱小位图资源,将其组装到一个tile-sheet并通过source-rect属性直接从中绘制你的东西

我希望它可以帮到你!内存泄漏 - 如此头痛.

PS在不同的浏览器中测试您的游戏,IE - 大多数泄漏,有时它每次刷新后都不会清除内存.