減少過度繪製

本頁將會介紹過度繪製和相關診斷方式,並說明可利用哪些方法排除或減緩過度繪製問題。

如果應用程式在單一影格中繪製同一個像素超過一次,這就是所謂的「過度繪製」。通常不需要使用過度繪製,因此最好是消除。這種情形會浪費 GPU 時間來轉譯使用者在畫面上看不到的像素,造成效能問題。

關於過度繪製

過度繪製是指系統在轉譯單一影格時,多次繪製畫面上的像素。舉例來說,如有多個堆疊的 UI 資訊卡,每個資訊卡都會遮住後方資訊卡的一部分。

然而,系統仍需要繪製資訊卡堆疊中隱藏的部分。這是因為堆疊的資訊卡會按照畫家演算法轉譯,也就是從後方到前方依序轉譯。這種轉譯順序可讓系統為陰影等透明物件套用合適的 Alpha 混合。

找出過度繪製問題

這個平台提供下列工具,可協助您判斷過度繪製是否會影響應用程式的效能。

偵錯 GPU 過度繪製工具

偵錯 GPU 過度繪製工具會使用顏色標記,顯示應用程式繪製畫面上每個像素的次數。這個次數越多,代表過度繪製影響應用程式效能的可能性越高。

詳情請參閱「視覺化呈現 GPU 過度繪製」。

剖析 GPU 轉譯工具

剖析 GPU 轉譯工具會以捲動式直方圖的形式,呈現每個轉譯管道階段顯示單一影格所花費的時間。每個長條中橘色的「處理」部分代表系統切換緩衝區的時間點,這項指標可提供關於過度繪製的重要線索。

在效能較低的 GPU 上,可提供的填充率可能會相當低。填充率是指 GPU 填滿影格緩衝區的速度。隨著繪製影格所需的像素量增加,GPU 處理新指令所需的時間也可能延長,還可能要求系統其他部分等候 GPU 跟上進度。「處理」長條可顯示高峰出現的原因,是 GPU 為了嘗試盡快繪製像素而不堪負荷。除了像素原始數量,其他問題也可能造成這項指標出現高峰。舉例來說,如果偵錯 GPU 過度繪製工具的顯示內容出現大量過度繪製和「處理」高峰,則表示可能是過度繪製問題。

詳情請參閱「剖析 GPU 轉譯速度」。

修正過度繪製

您可以採用以下策略,減少或排除過度繪製問題:

  • 移除版面配置中不必要的背景。
  • 壓平合併檢視區塊階層。
  • 減少透明效果。

本節將介紹以上做法。

移除版面配置中不必要的背景

根據預設,版面配置並沒有背景,因此只會轉譯版面配置本身,不會轉譯其他內容。但如果版面配置有背景,就可能發生過度繪製。

移除不必要的背景可改善轉譯效能。不必要的背景可能會遭應用程式在上面繪製的項目完全遮住,因此使用者可能看不到這種背景。舉例來說,系統繪製子項檢視畫面時,可能會完全蓋住後方的父項背景。

如果想找出過度繪製的原因,請使用版面配置檢查器工具檢視階層。請在檢查過程中找出使用者看不到的背景,並移除這些背景。如有多個容器共用一個背景顏色,您就能藉機移除不需要的背景。您可以將視窗背景設為應用程式的主要背景顏色,然後不定義上方所有容器的背景值。

壓平合併檢視區塊階層

新型版面配置可協助您堆疊檢視畫面,製作出美觀設計。不過,這麼做可能會導致過度繪製,尤其如果堆疊的檢視畫面物件都是不透明物件,系統就必須同時繪製畫面上看得見和看不見的像素,進而降低效能。

遇到這類問題時,建議您最佳化檢視區塊階層,減少重疊的 UI 物件數量,藉此改善效能。如要進一步瞭解操作方法,請參閱「效能與檢視區塊階層」。

減少透明效果

在畫面上轉譯透明像素稱為「Alpha 轉譯」,是造成過度繪製的主要原因。在標準的過度繪製情況中,系統會在已繪製的現有像素上方繪製不透明像素,因而隱藏已繪製的現有像素。但透明物件的不同之處在於需要先繪製現有像素,才能使用正確的混合方程式。

透明動畫、淡出、投射陰影等視覺效果都會使用透明物件,因此會嚴重造成過度繪製。在這些情況下,您可以減少要轉譯的透明物件數量,藉此改善過度繪製問題。舉例來說,如果想獲得灰色文字,您可以在 TextView 繪製黑色文字,再設定透明的 Alpha 值。不過,直接繪製灰色文字也能達到一樣的效果,還能改善效能。

如果想進一步瞭解透明效果對整體繪製管道的影響,請觀看「透明效果的隱藏成本」影片。