【问题标题】:Profiling and Optimizing a game android分析和优化游戏 android
【发布时间】:2011-08-15 01:01:02
【问题描述】:

我正在制作我的第一个 Android 游戏,它将是一款使用 opengl es 的 3D 街机游戏。我已经研究了很长时间,主要是优化引擎以适应未来的灵活性。

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

我来自桌面游戏开发背景,之前我从未对优化感兴趣。你有什么建议可以帮助我加快游戏速度?

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

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

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

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

我是分析和优化的新手。如何使用 android 调试工具(或其他第三方工具)更好地了解我的游戏在运行时的执行情况,以及何时/为何冻结,以便我可以修复它们。

另外,额外的问题:):有没有办法让我看到它在其他手机上的表现,而无需实际拥有手机或不认识拥有手机的人?比如,即使我没有 Droid X,我认识的人也不知道,它在 Droid X 上的运行速度有多快

【问题讨论】:

  • 您是否在 Eclipse 的 DDMS 视图中跟踪了堆分配?每次有 GC 时它都会刷新,因此您可以确定冻结是否与 GC 调用相关。从那里您可以深入了解实际分配的内容并从那里开始。它最有可能是分配(new 任何东西),所以您自然会希望预先分配所有内容并尽可能多地利用对象池。

标签: android optimization garbage-collection profiling


【解决方案1】:

您是否尝试过使用 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

这将显示哪些课程需要更多时间。您也许可以优化较慢的类,和/或将其移至后台线程。

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

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

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

编辑 -

您现在似乎需要转换 Android-hprof 文件,如 here 所述。

【讨论】:

  • 只是调试跟踪的一个注释,需要 WRITE_EXTERNAL_STORAGE 权限。
【解决方案2】:

基本上我能想到的就这些了 正在做。我不知道还有什么可以 让它滞后。

很多人都这样做,这是通过尝试思考事物来优化。这将带您走一部分,但只是一部分,尤其是在软件很大的情况下。

实际上,代码中的东西需要时间expose themselves 才能通过快照发现。 你不需要考虑它们。 您只需让程序显示它们。 Here's an example.

【讨论】:

    【解决方案3】:

    首先仔细看看 logcat 的意思。也许你会找到不想要的滞后问题的答案。其次,如果您想检查方法执行的频率和时间,只需使用 DDMS。不知道您使用的是哪种环境,但 Eclipse 中有一个 Perspective,其中有一个名为“Start method profiling”的选项。只需单击它,然后等待几秒钟然后取消单击它。片刻之后,您将获得压倒性的报告。 设备问题,让我引用一下:“如果你想知道你的应用程序在给定设备上的表现如何,你需要在那个设备上进行测试。”来自 [1]

    [1]http://developer.android.com/guide/practices/design/performance.html

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多