12

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

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

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

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

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

4

6 回答 6

17
  1. 减小纹理大小。
  2. 减少纹理切换(也就是尝试使用 spritesheets,以便尽可能少地更改纹理)
  3. 使用质量较低的纹理(RGBA4444 或 RGB565 而不是 RGBA8888)..
  4. 在实体不需要更新的地方调用 setIgnoreUpdate。
  5. 如果可能,请使用 SpriteBatches

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

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

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

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

于 2011-12-06T03:22:57.390 回答
12

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

于 2011-06-20T14:08:42.677 回答
7

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

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

于 2011-06-16T13:11:13.997 回答
5

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

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

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

如何配置我的 Android 应用程序?

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

于 2012-09-10T14:15:35.157 回答
4

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

于 2011-05-28T17:04:10.157 回答
0

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

于 2014-05-23T20:51:22.617 回答