【问题标题】:Optimization of AndEngine gameAndEngine游戏优化
【发布时间】:2011-09-04 00:03:31
【问题描述】:

我在我的游戏中使用 java + AndEngine。

在游戏过程中我有一些卡顿,我查找了一些信息并找到了一些如何优化游戏性能的步骤:

  1. 避免 GC(垃圾收集器) 在游戏的主要动作中调用:
    a) 不要在游戏时创建对象;
    b) 不要创建不必要的对象;
  2. 优化重复的代码 经常

我遵循了这些步骤,但在游戏过程中我总是有一些冻结。

现在我在游戏开始之前创建和加载所有纹理并且不卸载它们,这是一个坏主意吗?如何优化游戏进程? 也许我必须在主要活动之前释放所有可能的内存,然后在每个级别之后重新加载它们?

【问题讨论】:

  • hmm.. 真的,我现在不删除它们,我想我必须在游戏活动之前卸载所有无用的东西

标签: android performance freeze game-physics andengine


【解决方案1】:

在进行抢先优化之前先分析代码的重要性怎么强调都不为过。如果您受 GPU 限制(这不太可能,但由于您使用 GLES2.0 和可编程管道,并且我们不知道您是如何编写 GLSL 代码的,那么优化所有精灵等几乎没有意义,这是可能的)。

您可以使用一些工具进行分析,因为有不同的东西需要分析。

对于内存分析,您可以使用 DDMS 和 traceview 检查内存分配以及在特定时间段内调用 GC 的频率。这个 SO 问题有详细信息:

How can I profile my Android app?

关于经常运行的代码,您始终可以自己计时并将结果写入日志文件。这有点费力,但您可能已经知道您自己的代码可能会慢的地方。

【讨论】:

  • 好点,我想这是一个如此明显的建议,没有人愿意建议:-) 另外,考虑到问题的日期,OP 没有使用 GLES2,因为它仍在开发中那时。
【解决方案2】:

这肯定会提高您的游戏性能:始终保持默认主题不渲染。这是一个教程http://www.andengine.org/forums/tutorials/andengine-performance-tip-of-the-day-t810.html

【讨论】:

    【解决方案3】:
    1. 减小纹理大小。
    2. 减少纹理切换(也就是尝试使用 spritesheets,以便尽可能少地更改纹理)
    3. 使用质量较低的纹理(RGBA4444 或 RGB565 而不是 RGBA8888)..
    4. 在实体不需要更新时调用 setIgnoreUpdate。
    5. Use SpriteBatches if possible

    仅供参考: AndEngine 的下一个版本(将于 12 月中旬推出)支持 GLES2,因此您有更多可能通过自定义着色器和实体来提高性能。

    它还将在 GL-Thread 的第一帧上执行启动管道(onLoadEngine/onLoadResources/onLoadScene/onLoadComplete),而不是在 UI-Thread 上(直接在 onCreate 中)执行阻塞。

    它还允许您轻松地将管道的各个阶段卸载到线程中,而不会破坏整个管道。将有一个非常简单的实现 BaseGameActivity 的子类,它在执行管道阶段时显示确定的 ProgressDialog。实体将在附加到场景时弹出。

    一般来说,这意味着实际加载时间会减少,更重要的是,毛毡加载时间会显着减少!与以前相比,创建加载屏幕非常简单。

    【讨论】:

    • 正如我的帖子中提到的,这里是关于 12 月 GLES2 版本的信息:andengine.org/forums/announces/…
    • 有没有可能加快显示 TMX 地图的速度? TMXLayer.draw() 分别绘制每个图块。有没有机会将多个 TMX 瓦片放入单个顶点缓冲区并一次绘制它们?
    【解决方案4】:

    您可以使用 AndEngine:使用对象池来提高性能 http://c0deattack.wordpress.com/2011/01/06/andengine-using-the-object-pool/

    【讨论】:

    • 这不一定会提高性能,但有助于减少垃圾收集,这可能会使游戏感觉更流畅!
    【解决方案5】:

    您可能需要发布一些关于您的游戏的更具体的信息,但一个建议是确保您重复使用精灵和对象。例如,如果您的游戏有任何类型的重复生成的对象(随机飞行的敌人、子弹、重复的背景元素),请尝试考虑一次在屏幕上需要的该对象的最大数量,然后创建那么多在游戏开始之前,根据需要加载和重置它们。

    例如,我的游戏使用从屏幕顶部“随机”飞入的敌人。起初我每次调用都会制造一个新敌人,但现在我有一个 ArrayList,它总共只包含 6 个敌人,每个敌人都被重复使用和移动数百次。这为我带来了巨大的性能提升,尤其是在较长的游戏会话中。这与 GC 优化有关,但您之前可能没有关于优化的内容。

    【讨论】:

    • 对象的重用通常称为对象池。使用对象池会阻止 GC 运行。
    【解决方案6】:

    我使用的方法是在关卡开始之前加载所有需要的纹理。当你进入下一个级别时,你应该只卸载下一个级别不需要的对象的纹理。其他的,如记分牌或主背景不应该被加载。当然,您需要在活动的 onStop 中卸载所有纹理。 确实,首先您应该优化循环代码,例如,您不应该在循环期间访问任何资源,在开始循环之前尝试获取所有资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2021-10-29
      • 2011-12-02
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多