0

我想计算 FPS 以检测基于现有 Android 分析工具的应用程序的性能问题。

我注意到在 Systrace 上,它可以记录 performTraversals 的长度。据我所知,performTraversals 执行测量、布局和绘制,其中包括更新框架时的大部分工作。那么 performTraversals 能否具有足够的代表性来衡量一个帧是否需要 60 毫秒才能更新?

我还注意到 Systrace 记录了在 SurfaceFlinger 上花费的时间。我知道 SurfaceFlinger 用于渲染目的,但我不知道帧的确切起点和终点。我是否还应该考虑花在 SurfaceFlinger 上的时间和帧速率?(虽然我确实观察到 SurfaceFlinger 比 performTraversals 执行的频率更高,这意味着 SurfaceFlinger 可能不一定遵循 performTraversals。它也会在其他场景中触发。)

PS 我知道 sysdump gfxinfo,但它只能记录 128 帧(~2 秒),而我想要的可能会持续更长时间。

4

1 回答 1

1

Systrace 对于测量整体 FPS 没有用处,但您可以使用帧计数器和System.nanoTime(). 但是,如果您没有达到目标帧速率,它可以帮助您找出原因。

官方文档提供了一些有用的提示,但信息量很大,交互可能很复杂。需要了解的关键事项是:

  • 设备显示面板生成垂直同步信号。你可以在 VSYNC 线上看到它。每次它在 1 和 0 之间转换时都是一次刷新。
  • vsync 唤醒 surfaceflinger,它为各种窗口收集传入缓冲区并合成它们(它自己使用 OpenGL ES,或通过 Hardware Composer)。
  • 如果您的应用程序运行速度快于面板刷新率(通常为 60fps),它将阻止等待 surfaceflinger(例如,在 中eglSwapBuffers())。一旦 surfaceflinger 获得缓冲区,应用程序就可以自由地继续并生成另一个帧。
  • 除非你在屏幕外渲染,否则你不能比 Surfaceflinger 更快。

从 Android 4.3 (API 18) 开始,您可以使用android.os.Trace类将自己的事件添加到 systrace 输出中。用跟踪标记包裹你的绘图方法可以提供非常丰富的信息。您必须使用 systrace 启用他们的标签才能看到它们。

如果您想以 60fps 的速度运行,您的渲染必须在 16.7 毫秒内完成。如果您看到一次调用performTraversals花费的时间比这更长,那么您将不会达到最大速度。

于 2013-07-30T05:01:31.407 回答