檢查 GPU 轉譯速度和過度繪製

Android 系統提供了一些裝置端開發人員選項,可以視覺化呈現應用程式在轉譯 UI 時可能發生的問題,例如執行多餘的轉譯工作、長時間執行緒和 GPU 作業。本頁面會說明如何對 GPU 過度繪製和 GPU 轉譯剖析偵錯。

如要進一步瞭解裝置端開發人員選項及其啟用方式,請參閱「設定裝置端開發人員選項」一文。

剖析 GPU 轉譯速度

剖析 GPU 轉譯工具會顯示捲動式直方圖,視覺化呈現相對於每影格 16.67 毫秒的基準,轉譯 UI 視窗影格所需時間。

在效能較低的 GPU 上,像素填充率 (GPU 可填滿影格緩衝區的速度) 可能會相當低。隨著繪製影格所需的像素量增加,GPU 處理新指令所需的時間也會延長,因此也會要求系統其他部分等候其跟上進度。您可以使用剖析工具找出 GPU 因嘗試繪製像素、或因嚴重過度繪製而不堪負荷的情形。

啟用剖析工具

開始之前,請先確認您使用的是搭載 Android 4.1 (API 級別 16) 以上版本的裝置,且已啟用開發人員選項。如要在使用應用程式時剖析裝置 GPU 轉譯,請按照下列步驟進行:

  1. 前往裝置的「設定」,輕觸「開發人員選項」
  2. 在「監控」部分中,根據裝置搭載的 Android 版本,選取「剖析 GPU 轉譯」或「剖析 HWUI 轉譯」
  3. 在「剖析 GPU 轉譯」對話方塊中,選取「在螢幕上顯示長條圖」,即可在裝置螢幕上疊加顯示圖表。
  4. 開啟要剖析的應用程式。

檢查輸出內容

在圖 1 顯示的剖析 GPU 轉譯圖表放大圖中,您可以看到如 Android 6.0 (API 級別 23) 所顯示的上色部分。

圖 1. 放大的剖析 GPU 轉譯圖表。

以下說明幾點輸出內容裡應該注意的事項:

  • 這項工具會為每個可見應用程式顯示圖表。
  • 橫軸上每個垂直長條都代表一個影格,每個垂直長條的高度則代表轉譯影格所需時間 (單位為毫秒)。
  • 綠色橫線代表 16.67 毫秒。如果想達到每秒 60 個影格,每個影格的垂直長條都需要保持在這條線以下。長條超出這條線時,動畫就可能會發生卡頓情形。
  • 這項工具會醒目顯示超過 16.67 毫秒門檻的影格,讓該長條較寬、較不透明。
  • 每個長條都有上色的元件,對應到轉譯管道中的特定階段。元件數量會因裝置的 API 級別而不同。

下表說明裝置搭載 Android 6.0 以上版本時,在剖析工具輸出內容中,垂直長條各區段代表的意義。

長條的元件轉譯階段說明
切換緩衝區 代表 CPU 等候 GPU 完成工作的時間。如果這個長條變高,表示應用程式在 GPU 執行過多工作。
指令問題 代表 Android 2D 轉譯器發出指令讓 OpenGL 繪製及重新繪製顯示清單花費的時間。此長條的高度,與每個顯示清單所需執行時間加總,直接成正比;顯示清單越多,紅色長條就越高。
同步和上傳 代表將點陣圖資訊上傳至 GPU 花費的時間。區隔偏大表示應用程式花費相當多的時間載入大量圖形。
繪圖 代表用來建立及更新檢視區塊顯示清單的時間。如果長條的這個部分偏高,表示可能有大量自訂檢視畫面繪製或使用 onDraw 方法的工作。
測量/版面配置 代表花費在檢視區塊階層內 onLayoutonMeasure 回呼的時間。區隔偏大表示檢視區塊階層花費在處理的時間較長。
處理輸入內容和動畫 代表評估該影格要執行的所有動畫及處理所有輸入回呼花費的時間。如果這個區隔偏大,可能表示自訂動畫或輸入回呼花費太多處理時間。這個區隔期間通常也會發生捲動時的檢視繫結 (例如 RecyclerView.Adapter.onBindViewHolder()),是導致這個區隔速度變慢更常見的原因。
其他時間/VSync 延遲 代表應用程式在兩個連續影格之間執行作業花費的時間。這可能表示 UI 執行緒中發生太多處理程序,以致可能會卸載到其他執行緒。

表 1. Android 6.0 以上版本的元件長條。

Android 4.0 (API 級別 14) 與 5.0 (API 級別 21) 之間的版本會有藍色、紫色、紅色和橘色的區隔。Android 4.0 以下版本只有藍色、紅色和橘色元件。下表列出的是 Android 4.0 和 5.0 的元件長條。

長條的元件轉譯階段說明
程序 代表 CPU 等候 GPU 完成工作的時間。如果這個長條變高,表示應用程式在 GPU 上執行過多工作。
執行 代表 Android 2D 轉譯器發出指令讓 OpenGL 繪製及重新繪製顯示清單花費的時間。此長條的高度,與每個顯示清單所需執行時間加總,直接成正比;顯示清單越多,紅色長條就越高。
XFer 代表將點陣圖資訊上傳至 GPU 花費的時間。區隔偏大表示應用程式花費相當多的時間載入大量圖形。搭載 Android 4.0 以下版本的裝置不會顯示這個區隔。
更新 代表用來建立及更新檢視區塊顯示清單的時間。如果長條的這個部分偏高,表示可能有大量自訂檢視畫面繪製或使用 onDraw 方法的工作。

表 2. Android 4.0 和 5.0 的元件長條。

如要進一步瞭解如何解讀剖析工具提供的資訊,請參閱「使用剖析 GPU 轉譯工具進行分析」一文。

注意:雖然這個工具的名稱為「剖析 GPU 轉譯」,但實際上所有監控程序都發生在 CPU 內。轉譯程序是由發出指令到 GPU 開始,GPU 會以非同步方式轉譯畫面。在某些情況下,GPU 要執行的工作太多,導致 CPU 必須等候才能發出新的指令。發生這種情況時,橘色和紅色長條會大幅增高,系統會封鎖發出的指令,直到 GPU 指令佇列釋出更多空間。

視覺化呈現 GPU 過度繪製

開發人員選項的另一項功能可以為 UI 加上顏色標記,幫助您找出過度繪製的情形。應用程式在相同影格內多次繪製同一個像素,就是發生過度繪製的情形。經過視覺化之後,可以瞭解應用程式是否有額外執行不必要的轉譯工作,GPU 執行額外的工作來轉譯使用者不會看到的像素,可能會降低效能。因此,您應該盡可能修正過度繪製事件

如果您尚未啟用開發人員選項,請執行這項操作。接著按照下列步驟進行,即可在裝置上視覺化呈現過度繪製情形:

  1. 前往裝置的「設定」,輕觸「開發人員選項」
  2. 往下捲動到「硬體加速轉譯」部分,選取「針對 GPU 過度繪製進行偵錯」
  3. 在「針對 GPU 過度繪製進行偵錯」對話方塊中選取「顯示過度繪製區域」

Android 會為 UI 元素標上顏色,識別過度繪製次數,如下所示:

  • 真實色彩:沒有過度繪製情形
  • 藍色:過度繪製 1 次
  • 綠色:過度繪製 2 次
  • 粉紅色:過度繪製 3 次
  • 紅色:過度繪製 4 次以上

圖 2. 正常顯示的應用程式 (左側),以及啟用 GPU 過度繪製後顯示的應用程式 (右側)

請注意,這些顏色會以半透明的形式標示,因此畫面顯示的確切顏色視 UI 內容而定。

現在您可以識別版面配置中哪些位置發生過度繪製的情形,建議您閱讀如何減少過度繪製的相關文章。

請注意,部分過度繪製情形是無法避免的。調整應用程式的使用者介面時,請嘗試達到以視覺化呈現的畫面,大部分區域可顯示真實色彩或只有 1 次過度繪製 (藍色) 的目標。

圖 3. 含有大量過度繪製 (左側) 和大幅減少過度繪製 (右側) 的應用程式範例