我想计算FPS以检测基于现有Android分析工具的应用程序的性能问题。
我注意到在Systrace上,它可以记录performTraversals的长度。据我所知,performTraversals执行测量,布局和绘制,其中包括更新帧时的大多数作业。那么,performTraversals是否具有足够的代表性来衡量一帧是否需要60毫秒来更新?
我还注意到Systrace记录了SurfaceFlinger上的时间。我知道SurfaceFlinger用于渲染目的,但我不知道帧的确切起点和终点。我还应该考虑SurfaceFlinger花在帧速率上的时间吗? (虽然我确实观察到SurfaceFlinger比performTraversals更频繁地执行,这意味着SurfaceFlinger可能不一定跟随performTraversals。它也会在其他情况下触发。)
P.S。我知道sysdump gfxinfo,但它只能录制128帧(约2秒),而我想要的可能会持续更长时间。
答案 0 :(得分:1)
Systrace对于整体测量FPS没有用,但是您可以通过帧计数器和System.nanoTime()
轻松完成。但是,如果你没有达到你的目标帧率,它可以帮助你找出原因。
official docs提供了一些有用的指针,但是有很多信息,而且交互可能很复杂。关键的事情是:
eglSwapBuffers()
)。一旦surfaceflinger获得缓冲区,应用程序就可以继续并生成另一个框架。从Android 4.3(API 18)开始,您可以使用android.os.Trace类将自己的事件添加到systrace输出中。使用痕迹标记包装您的绘图方法可以提供非常丰富的信息。您必须使用systrace启用其标记才能看到它们。
如果你想以60fps的速度运行,你的渲染必须在16.7ms以下完成。如果你看到performTraversals
的单次调用时间超过了这个时间,那么你就无法达到最高速度。