我可以使用performTraversals来测量Android上的FPS吗?

时间:2013-07-30 01:42:47

标签: android android-view performance-testing systrace surfaceflinger

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

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

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

P.S。我知道sysdump gfxinfo,但它只能录制128帧(约2秒),而我想要的可能会持续更长时间。

1 个答案:

答案 0 :(得分:1)

Systrace对于整体测量FPS没有用,但是您可以通过帧计数器和System.nanoTime()轻松完成。但是,如果你没有达到你的目标帧率,它可以帮助你找出原因。

official docs提供了一些有用的指针,但是有很多信息,而且交互可能很复杂。关键的事情是:

  • 设备显示面板生成vsync信号。你可以在VSYNC线上看到它。每次在1和0之间转换都是刷新。
  • vsync唤醒了surfaceflinger,它收集各种窗口的传入缓冲区并将它们合成(使用OpenGL ES或通过硬件编辑器本身)。
  • 如果您的应用运行速度超过面板刷新率(通常为60fps),则会阻止等待surfaceflinger(例如,eglSwapBuffers())。一旦surfaceflinger获得缓冲区,应用程序就可以继续并生成另一个框架。
  • 除非你在屏幕外渲染,否则你的速度要快于surfaceflinger。

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

如果你想以60fps的速度运行,你的渲染必须在16.7ms以下完成。如果你看到performTraversals的单次调用时间超过了这个时间,那么你就无法达到最高速度。