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

Android 在裝置端有提供一些開發人員選項,可以幫助您視覺化應用程式在轉譯 UI 時可能發生的問題,例如執行太多不必要的轉譯工作,或執行長時間的執行緒和 GPU 作業。本頁面會說明如何偵錯 GPU 過度繪製和剖析 GPU 轉譯作業。

如果想進一步瞭解裝置端提供的開發人員選項 (包括啟用方式),請參閱「設定裝置端開發人員選項」。

剖析 GPU 轉譯速度

剖析 GPU 轉譯工具可以用視覺化方式 (捲動式直方圖) 呈現轉譯 UI 視窗影格所需的時間,這個時間和和每影格 16.67 毫秒進行基準測試相關。

在效能較低的 GPU 上,可提供的供應率 (GPU 供應影格緩衝區的速度) 可能會非常低。隨著影格要繪製的像素增加,GPU 處理新指令所需的時間也會增加,當 GPU 無法順利處理時,就會要求其他系統等待處理完畢。剖析工具可以協助您識別繪製像素作業超出 GPU 處理能力,或被大量過度繪製拖慢效能的情況,

啟用分析器

在開始進行之前,請先確定您的裝置執行 Android 4.1 (API 級別 16) 以上版本,而且您已經啟用了開發人員選項。如果要在使用應用程式的同時剖析裝置的 GPU 轉譯程序,請按照以下說明操作:

  1. 前往裝置的「設定」,然後按一下「開發人員選項」
  2. 點選「監控」區段的「剖析 GPU 轉譯」或「剖析 HWUI 轉譯」 (視裝置執行的 Android 版本而定)。
  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 內容而定。

您現在可以看到版面配置中發生過度繪製的區域了,請參閱「如何減少過度繪製」。

請記得,有些過度繪製是無法避免的。調整應用程式的使用者介面時,請以視覺化之後多半畫面可顯示真實顏色或只有 1X 個過度繪製 (藍色) 為目標。

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