0

我想計算FPS來檢測基於現有Android分析工具的應用程序的性能問題。我可以使用performTraversals來測量Android上的FPS嗎?

我注意到,在Systrace上,它可以記錄performTraversals的長度。據我所知,performTraversals執行度量,佈局和繪製,其中包括更新框架時的大部分作業。那麼performTraversals是否足夠具有代表性,可以測量幀是否需要60 ms更新?

我還注意到Systrace記錄在SurfaceFlinger上花費的時間。我知道SurfaceFlinger用於渲染目的,但我不知道幀的確切開始點和結束點。我是否也應該考慮在SurfaceFlinger上花費的幀時間? (儘管我確實觀察到SurfaceFlinger比performTraversals執行得更頻繁,這意味着SurfaceFlinger可能不一定跟隨performTraversals,在其他情況下也會觸發它。)

P.S.我知道sysdump gfxinfo,但它只能記錄128幀(〜2秒),而我想要的可能會持續更長的時間。

回答

1

Systrace對整體測量FPS沒有用處,但您可以用一個幀計數器和System.nanoTime()來做這件事。如果你沒有達到目標幀率,它可以幫助你找出原因。

official docs提供了一些有用的指針,但有很多信息,交互可能很複雜。要知道的關鍵是:

  • 設備顯示面板生成一個vsync信號。你可以在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.7ms以內完成。如果您看到一次調用花費的時間比這更長,那麼您不會達到最高速度。

+0

嗨!法登,感謝您提供豐富的答案。我目前的情況是,我沒有針對大多數正在測試的應用程序的源代碼。我想這會使幀計數器解決方案不可行。我想要的可能不是幀頻,而是使用Systrace上的數據來檢測帶時間戳信息的潛在性能問題。我知道我可以通過performTraversals的運行itme推斷janks。似乎SurfaceFlinger線程上的onMessageReceived方法也可能需要超過10毫秒。這也會影響幀速率嗎? –

+0

我假設你已啓用「gfx」和「view」標籤。理想情況下,surfaceflinger只需要很少的時間來運行,並在每個vsync上重新開始(假設有活動 - 如果沒有任何動畫可以延長電池壽命,則關閉vsync事件)。如果surfaceflinger速度較慢,通常是因爲它正在等待GPU渲染完成。對於典型的應用程序,您可以查看視圖持續時間以查看緩慢渲染幀,然後使用hierarchyviewer檢查是否存在明顯的問題。在新發布的Android 4.3中,可用信息要好得多。 – fadden

相關問題