我在我的游戏中使用 java + AndEngine。
在游戏过程中我有一些冻结,我查找了信息并找到了一些如何优化游戏性能的步骤:
- 避免在游戏的主要动作中调用 GC(垃圾收集器):
a) 不要在游戏时创建对象;
b) 不要创建不必要的对象; - 优化经常重复的代码
我遵循了这些步骤,但在游戏过程中我有一些冻结。
现在我在游戏开始之前创建和加载所有纹理并且不卸载它们,这是一个坏主意吗?如何优化游戏进程?也许我必须在主要活动之前释放所有可能的内存,然后在每个级别之后重新加载它们?
我在我的游戏中使用 java + AndEngine。
在游戏过程中我有一些冻结,我查找了信息并找到了一些如何优化游戏性能的步骤:
我遵循了这些步骤,但在游戏过程中我有一些冻结。
现在我在游戏开始之前创建和加载所有纹理并且不卸载它们,这是一个坏主意吗?如何优化游戏进程?也许我必须在主要活动之前释放所有可能的内存,然后在每个级别之后重新加载它们?
仅供参考:AndEngine 的下一个版本(将于 12 月中旬推出)支持 GLES2,因此您有更多可能通过自定义着色器和实体来提高性能。
它还将在 GL 线程的第一帧上执行启动管道(onLoadEngine/onLoadResources/onLoadScene/onLoadComplete),而不是在 UI 线程上(直接在 onCreate)上执行阻塞。
它还允许您轻松地将管道的各个阶段卸载到线程中,而不会破坏整个管道。将有一个非常容易实现的 BaseGameActivity 子类,它在执行管道阶段时显示确定的 ProgressDialog。实体将在它们附加到场景时弹出。
一般来说,这意味着实际加载时间减少了,更重要的是,毛毡加载时间显着减少!与之前的痛苦相比,创建加载屏幕非常简单。
您可以使用AndEngine 提高性能:使用对象池 http://c0deattack.wordpress.com/2011/01/06/andengine-using-the-object-pool/
你可能需要发布一些关于你的游戏的更具体的信息,但一个建议是确保你重复使用精灵和对象。例如,如果您的游戏有任何类型的重复生成的对象(随机飞行的敌人、子弹、重复的背景元素),请尝试考虑一次在屏幕上需要的该对象的最大数量,然后创建那么多在游戏开始之前,根据需要加载和重置它们。
例如,我的游戏使用从屏幕顶部“随机”飞入的敌人。起初我每次调用都会制造一个新敌人,但现在我有一个 ArrayList,它总共只包含 6 个敌人,每个敌人都被重复使用和移动数百次。这为我带来了巨大的性能提升,尤其是在较长的游戏会话中。这与 GC 优化有关,但您之前可能没有关于优化的内容。
在进行抢先优化之前先分析代码的重要性怎么强调都不为过。如果您受 GPU 限制(这不太可能,但由于您使用 GLES2.0 和可编程管道,并且我们不知道您是如何编写 GLSL 代码的,那么优化所有精灵等几乎没有意义,这是可能的)。
有一些工具可以用于分析,因为有不同的东西需要分析。
对于内存分析,您可以使用 DDMS 和 traceview 来检查内存分配以及在特定时间段内调用 GC 的频率。这个 SO question 有详细信息:
关于经常运行的代码,您始终可以自己计时并将结果写入日志文件。它有点费力,但您可能已经知道您自己的代码在哪里可能很慢。
我使用的方法是在关卡开始之前加载所有需要的纹理。当您进入下一个级别时,您应该只卸载下一个级别不需要的对象的纹理。其他的,如记分牌或主背景不应该被加载。当然,您需要在活动的 onStop 中卸载所有纹理。确实,首先您应该优化循环代码,例如,您不应该在循环期间访问任何资源,在开始循环之前尝试全部获取它们。
这肯定会提高您的游戏性能:始终保持默认主题不渲染。这是一个教程http://www.andengine.org/forums/tutorials/andengine-performance-tip-of-the-day-t810.html