預估 CPU 和 GPU 影格的處理時間

如要瞭解應用程式的效能並找出瓶頸,就必須估算 CPU 和 GPU 的畫格處理時間 (畫格時間)。使用 AGI 剖析應用程式時,系統剖析器會提供追蹤資料,讓您估算影格時間。

CPU 時間

在 AGI 中,您可以在系統設定檔的 CPU 追蹤中查看總 CPU 影格時間和活動 CPU 影格時間。

CPU 作業時間總計

如要評估 CPU 總耗用時間,請選取時間範圍,包含連續影格提交事件之間的時間。影格提交事件為 eglSwapBuffers (適用於 OpenGL) 和 vkQueuePresentKHR (適用於 Vulkan)。

eglSwapBuffer 事件的螢幕截圖。
圖 1. 兩個 eglSwapBuffer 事件之間的時間。


vkQueuePresentKHR 事件的螢幕截圖。
圖 2. 兩個 vkQueuePresentKHR 事件之間的時間。

這項評估結果是 CPU 總時間的預估值,但不一定代表有效的 CPU 時間。舉例來說,在 GPU 繫結應用程式中,CPU 可能會等待 GPU 完成工作,再提交新的影格。這通常發生在 dequeueBuffereglSwapBuffer (適用於 OpenGL) 或 vkQueuePresent (適用於 Vulkan) 事件占用大量 CPU 時間時。等待時間會計入 CPU 總時間,但不會計入 CPU 有效時間。

螢幕截圖:顯示 dequeueBuffer 和 eglSwapBuffer 事件期間大量閒置的情況。
圖 3.dequeueBuffereglSwapBuffer 事件期間,CPU 大量閒置。

活動 CPU 時間

主動 CPU 時間會判斷 CPU 在執行應用程式程式碼時是否處於閒置狀態。

如要評估 CPU 活動時間,請查看 CPU 事件上方的「Running」區塊。計算兩個處於「Running」狀態的畫面提交事件之間的所有追蹤記錄。請務必加入可運作的執行緒。

兩個可用於評估 CPU 活動時間的 CPU 時間期間的螢幕截圖。
圖 5. 兩個可用於評估 CPU 活動時間的 CPU 時間間隔。


在主執行緒閒置時,多執行緒應用程式有其他執行緒在運作的螢幕截圖。
圖 6. 在主執行緒閒置時,有其他執行緒在運作的多執行緒應用程式。

另一種評估 CPU 時間的方法,是查看 CPU 追蹤中的應用程式切片。這些切片會指出 CPU 執行的時間,並與「Running」切片相對應。

螢幕截圖:顯示與 CPU 追蹤相符的固定執行緒執行狀態。
圖 7. 已固定的執行緒執行狀態與 CPU 追蹤相符。

如要識別應用程式切片,您可以為應用程式新增 ATrace 標記。這會在系統分析器的 CPU 追蹤記錄中顯示標記。

螢幕截圖:CPU 追蹤畫面上的 ATrace 切片。
圖 8.CPU 追蹤畫面上顯示的 ATrace 切片。

估算 GPU 影格時間

如要估算 GPU 影格時間,您可以在系統分析工具中使用 GPU 切片或 GPU 計數器。使用 GPU 切片時,預估值會更準確。

GPU 切片

如果系統分析工具提供 GPU 切片資訊,您可以測量應用程式處理與單一影格相關聯的作業所花費的總時間,藉此取得非常精確的 GPU 影格時間資訊。

Mali 裝置

在 Mali 裝置上,GPU 切片具有「片段」、「非片段」,以及偶爾的「附加非片段」軌道。對於較不複雜的框架,片段和非片段的工作是依序進行,因此只要查看有效 GPU 工作之間的差距,即可區分不同框架的工作。

或者,如果您熟悉提交至 GPU 的工作,可以找出提交的算繪階段模式,瞭解影格開始和結束的時間。

依序執行多個影格時的螢幕截圖。
圖 9.依序執行多個影格。
這張螢幕截圖顯示 AGI 放大個別影格的工作。
圖 10. 放大檢視個別影格的工作內容。

如果應用程式具有更大量並行的 GPU 工作流程,您可以查看每個切片的「Selection」窗格,找出具有相同 submissionID 的所有影格,藉此取得 GPU 影格時間。

對於以 Vulkan 為基礎的應用程式,您可以使用多個提交內容來組合影格。使用 Vulkan 事件追蹤,追蹤提交 ID,其中包含每個提交內容的切片。選取提交片段後,系統會醒目顯示與提交內容相對應的所有 GPU 活動片段。

並行 GPU 工作負載的螢幕截圖,其中一個影格的工作可能會與另一個影格重疊。
圖 11. 並行 GPU 工作負載,其中一個影格的工作可能會與另一個影格重疊。


螢幕截圖:為影格選取的多個 Vulkan 事件。
圖 12. 為影格選取的多個 Vulkan 事件。

Adreno 裝置

在 Adreno 裝置上,GPU 切片會顯示在 GPU 佇列 0 軌道中,且一律以順序顯示,因此您可以查看所有代表影格轉譯階段的切片,並使用這些切片來測量 GPU 影格時間。

依序執行多個影格時的螢幕截圖。
圖 13.依序執行多個影格。
螢幕截圖:在多個轉譯階段的畫面上,放大顯示 AGI。
圖 14. 放大顯示含有多個轉譯階段的影格。

與前述的 Mali 情境類似:如果應用程式使用 Vulkan,Vulkan 事件追蹤記錄會提供有關提交執行影格的工作資訊。如要醒目顯示算繪階段,請按一下與影格相關的 Vulkan 事件切片。

以 Vulkan 為基礎的應用程式螢幕截圖,其中已選取影格中的 Vulkan 事件。
圖 15. 以 Vulkan 為基礎的應用程式,其中選取了影格的 Vulkan 事件。

在某些情況下,由於應用程式受到 GPU 的嚴重限制,因此更難區分 GPU 影格邊界。在這些情況下,如果您熟悉提交至 GPU 的工作,就可以找出算繪階段執行的模式,並根據該資訊判斷影格邊界。

這張螢幕截圖顯示 GPU 綁定程度高的應用程式,其中包含可協助識別影格邊界的轉譯傳遞模式。
圖 16. 嚴重受 GPU 限制的應用程式,其中包含可協助識別影格邊界的轉譯傳遞模式。

GPU 計數器

如果追蹤記錄中沒有 GPU 切片資訊,您可以使用 GPU 計數器追蹤記錄來估算 GPU 影格時間。

Mali 裝置

在 Mali 裝置上,您可以使用 GPU 使用率追蹤記錄,估算 GPU 幀時間 (適用於非 GPU 密集型應用程式)。如果應用程式對 GPU 的使用量較低,則會出現 GPU 活動高峰和低谷的規律性週期,而非持續出現高峰活動。如要使用 GPU 使用率追蹤記錄來估算 GPU 影格時間,請評估追蹤記錄中高活動期間的時間長度。

Mali 裝置上的 GPU 使用率和 GPU 佇列追蹤記錄螢幕截圖。
圖 17. Mali 裝置上的 GPU 使用率和 GPU 佇列追蹤。

如果應用程式需要大量使用 GPU,GPU 使用率可能會持續維持在很高的水準。在這種情況下,您可以使用 片段佇列使用率非片段佇列使用率追蹤記錄,監控 GPU 活動並估算 GPU 影格時間。您可以查看片段非片段軌跡中的模式,粗略估算影格邊界的位置,然後使用這些資訊來測量 GPU 影格時間。

片段和非片段曲目的螢幕截圖。
圖 18。 Fragmentnon-fragment 軌道。

Adreno 裝置

在 Adreno 裝置上,如果應用程式並非 GPU 密集型,您可以使用與前文「Mali 裝置」相同的方式,估算 GPU 影格時間。

螢幕截圖:Adreno 裝置上的 GPU 使用率百分比和 GPU 佇列追蹤記錄。
圖 19. Adreno 裝置上的 GPU 使用率百分比和 GPU 佇列追蹤。

如果應用程式對 GPU 的使用率較高,且應用程式持續維持高 GPU 使用率百分比,您可以使用「Vertex Instructions / Second」和「Fragment Instructions / Second」追蹤記錄,估算 GPU 影格時間。您可以查看這些軌跡的活動層級,找出模式,藉此粗略估算影格邊界的位置,並用於評估 GPU 影格時間。

Vertex 指示 / 第二個軌道的螢幕截圖。
圖 20. Vertex Instructions / Second 追蹤記錄。

這些其他追蹤記錄可能會提供類似的資訊:

  • 每秒陰影處理頂點數
  • 每秒陰影片段數
  • % 著色頂點時間
  • % Time Shading Fragments