android - 分析和优化游戏 android

标签 android optimization garbage-collection profiling

我正在制作我的第一个 Android 游戏,它将是一个使用 opengl es 的 3D 街机游戏。我已经研究了很长时间,主要是针对 future 的灵 active 优化引擎。

无论如何,现在我已经完全完成了游戏功能和所有漂亮的东西,但它在不是我的调试手机的手机上滞后。该游戏具有非常高质量的移动游戏图形,因此预计会有一点延迟,但在 Nexus S 上运行游戏与在 MyTouch 4G 上运行游戏之间的性能差异是巨大的。该游戏甚至无法在 LG Optimus 等低端手机上玩(游戏可以运行,但太不稳定,无法舒适地玩)。在我的 Nexus S 上,我很少会出现断断续续的运动(我已经在游戏中实现了帧率独立运动)但是在 MyTouch 4G 上它更常见,尽管游戏仍然可以玩......但很烦人

我有桌面游戏开发背景,优化从来都不是我感兴趣的主题。您可以推荐什么来帮助我加快游戏速度?

我已经尽可能多地尝试优化代码,并且性能有了显着提高,但似乎有些事情我错过了或忽略了。这是一款拥有完整引擎和大量代码的大型游戏。

我已经尝试跟踪所有分配并确保它们在运行时不会被释放或遗忘,这样 GC 就不会在您玩游戏时被调用。这基本上就是我能想到的所有事情,我不知道还有什么可以让它变得滞后

而且我怀疑它的网格的多边形数量,因为尽管它们质量很高,但我在游戏中添加了一个选项,让您可以像在电脑游戏中一样从低、中和高中选择图形质量, Low 和 High 之间的差异在 600-900 个顶点之间!我注意到的唯一改进是加载时间。此外,没有任何特殊的后处理效果、照明、着色器、实时 SSS 或任何其他效果。只是有纹理的脸 :P

还有我提到的“滞后”是随机卡住。我很确定它们是 GC,但它可能是其他东西,因为我认为我已经找到并控制了所有分配(有很多)。由于我的游戏是独立于帧速率的,每当它解冻时,玩家和敌人以及所有东西都会“向前跳”以跟上,这使得本来就很困难的游戏变得更加困难!

我不熟悉分析和优化。我如何使用 Android 调试工具(或其他第三方工具)更好地了解我的游戏在运行时的表现,以及它何时/为什么卡住以便我可以修复它们。

另外,奖励问题 :) :有没有办法让我在不实际拥有手机或不认识拥有手机的人的情况下查看它在其他手机上的表现?比如,即使我没有 Droid X 也不认识任何人,它在 Droid X 上运行的速度有多快

最佳答案

您是否尝试过使用 traceview 分析代码? 插入

Debug.startMethodTracing("myfile");

然后在onCreate中

Debug.stopMethodTracing();

您希望它完成文件写入的位置。要查看结果,请将设备插入计算机并运行:

/path/to/android-sdk/platform-tools/adb pull /sdcard/myfile.trace
/path/to/android-sdk/tools/traceview ./myfile.trace

这将显示哪些类(class)花费了更多时间。您可以优化较慢的类,和/或将其移至后台线程。

您提到它在某些手机上运行良好,也许那些是具有 24mb/app 限制而不是 16mb/app 限制的较新手机?你可以试试 Memory Analyzer在 Eclipse 中,检查内存泄漏或不必要的大对象。要安装,请转到帮助 -> 安装软件,然后使用

http://download.eclipse.org/mat/1.1/update-site/

然后,当您在 DDMS View 中进行调试时,选择 Dump HPROF File(带有红色箭头的绿色玻璃),它应该会打开内存分析器。

编辑 -

看来您现在需要转换 Android-hprof 文件,如所述here .

关于android - 分析和优化游戏 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5824638/

相关文章:

android - 如何自动签署应用程序以进行计费?

android - TextView.setText() 不起作用

java - 按下主页按钮时在android中保存 Activity 状态

python - Cython 没有速度提升

android - 如何在改造中发送带有基本身份验证的帖子请求?

java - 使用jpa进行数据库搜索

optimization - GHC真的可以永远inline map、scanl、foldr等吗?

cassandra - cassandra 中的 G1GC 垃圾收集

c# - 枚举比手动检查不同的变化更便宜时,是否在比较期间将 1,000 多个字符串转换为小写?

java - 如果我们声明一个对象并将其分配给同一类的另一个对象会发生什么