0

我编写了一个 60 FPS 游戏,需要找到那些严重影响游戏循环性能的代码部分。我目前在帧的开头存储纳秒时间戳并将我的代码拆分为逻辑部分,例如“渲染粒子”或“遍历敌人 AI”。在完成每个部分的执行后,我存储自上一个部分完成以来执行代码所需的执行时间。最后,我检索总执行时间([nanoseconds now] 减去 [first nanosecond timestamp])并计算每个代码段执行时间的百分比。这使我可以显示每个部分所占的百分比,但似乎不是完美的解决方案。我猜 GC 会随机影响代码部分的执行。

有没有更好的方法可以实现甚至是 API / 分析工具来做到这一点?

4

1 回答 1

0

其中一位评论者推荐了traceview,它通常可用于检测用 Java 编写的代码以找出慢的地方。它对于 Java 和本机的混合使用不太有用(因为检测会不成比例地减慢 Java 代码的速度),并且当您试图确定使用 OpenGL 生成帧时是否满足或错过了最后期限时,它缺乏有用的上下文。

进行此类分析的首选方法是使用 systrace(文档解释)。从第二个链接可以看出,您可以直接将您的应用时间线与 vsync 事件和表面合成活动进行比较。

如果您运行的是 Android 4.3 (API 18) 或更高版本,您可以添加自己的事件。将这些添加到应用程序中的战略位置可以更轻松地可视化您的瓶颈。一个简单的例子可以在这里找到。(在我写这篇文章的时候,官方文档还没有描述 4.3 命令行的用法,所以最简单的方法就是按照这个例子。)

Android 4.3 还添加了“dalvik”标签;如果包含,您的跟踪将显示 GC 暂停的开始和结束位置,以及有关哪些线程实际暂停的完整详细信息。

于 2013-10-21T19:44:24.310 回答