減少過度繪製

Stay organized with collections Save and categorize content based on your preferences.

應用程式可能會在相同影格裡繪製同一個像素超過一次,這種事件稱作「過度繪製」。過度繪製通常沒有必要,最好將其排除。這個事件會轉譯使用者在畫面上看不到的像素,導致浪費 GPU 時間,屬於一種效能問題。

本文將會說明過度繪製是什麼、如何診斷,還有採取哪些行動可以排除或減緩過度繪製問題。

關於過度繪製

所謂過度繪製,指的是系統在同一個轉譯影格中多次繪製畫面上的某個像素。舉例來說,如果我們有多個堆疊起來的 UI 卡片,每個卡片都會遮蓋到後方卡片的一部分。

不過系統依然需要繪製堆疊卡片被隱藏的部分。這是因為堆疊卡片通常會按照畫家演算法轉譯:也就是從後方轉譯到前方。這種轉譯順序可以讓系統為透明物件 (例如陰影) 套用合適的 Alpha 版混和。

找出過度繪製問題

本平台提供了以下工具,可以幫助您判斷過度繪製是否會影響應用程式效能。

偵錯 GPU 過度繪製工具

偵錯 GPU 過度繪製工具可以藉由著色展示應用程式繪製畫面上每個像素的次數。這個次數越多,代表這越有可能就是影響應用程式效能的過度繪製問題。

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

剖析 GPU 轉譯工具

剖析 GPU 轉譯工具可以用捲動式直方圖的方式向您展示在每個階段內,每個轉譯管道顯示單一影格所花費的時間。每個長條的橘色「Process」(程序) 部分代表系統交換緩衝區的時機,這項指標是調查過度繪製很重要的線索。

在效能較低的 GPU 上,可提供的供應率 (GPU 供應影格緩衝區的速度) 可能會非常低。隨著影格要繪製的像素增加,GPU 處理新指令所需的時間也會增加,當 GPU 無法順利處理時,就會要求其他系統等待處理完畢。「Process」(程序) 長條顯示,當 GPU 嘗試儘快繪製像素時,工作負荷超出處理能力,同時發生尖峰。這種指數出現尖峰的原因可能並非像素原始數量。舉例來說,如果偵錯 GPU 過度繪製工具顯示大量的過度繪製和「Process」(程序) 尖峰,則可能表示是過度繪製的問題。

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

修正過度繪製

您可以藉由以下策略儘量減少或排除過度繪製問題:

  • 移除版面配置中不需要的背景。
  • 合併檢視區塊階層。
  • 降低透明度。

本章節會說明以上方法的資訊。

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

版面配置預設不使用背景,因此如果只有這個項目,則不需要轉譯任何內容。可是,如果版面配置有背景的時候,就可能會造成過度繪製。

移除不必要的背景可以迅速改善轉譯效能。沒有必要的背景會被應用程式其他繪製在上面的項目完全蓋住,使用者根本看不到這些背景。舉例來說,系統可能會在繪製子項檢視畫面的時候完全蓋住後方的父項背景。

如果想找出過度繪製的原因,請用面配置檢查器工具一一檢視各個階層。檢視時,尋找有沒有任何使用者看不到的背景,並排除這些背景。如果有許多容器共用同一個背景顏色,就是另一個排除沒有必要的背景的好機會:您可以把視窗背景設為應用程式主要背景的顏色,然後不定義其上所有容器的背景值。

合併檢視區塊階層

現代化的版面配置可以讓您輕鬆堆疊各種檢視畫面,藉此產生非常美觀的設計。不過,這樣做可能會導致過度繪製,進而降級效能,如果每個堆疊的檢視畫面物件都是不透明物件,而系統必須繪製畫面上可以看見和看不見的像素,這種情況就特別嚴重。

遇到這類問題的時候,您可以藉由最佳化檢視區塊階層,以便減少重疊的 UI 物件,藉此改善效能。如果想進一步瞭解如何達成此目標,請參閱「最佳化檢視區塊階層」。

降低透明度

在螢幕上轉譯透明像素 (稱作 Alpha 轉譯) 是造成過度繪製的主要原因。在標準過度繪製情況中,系統會因為在上方繪製不透明像素而隱藏已經繪製的像素,但透明物件不同之處在於需要先繪製現有像素,才能使用正確的混合方程式。透明動畫、淡出、投射陰影這類視覺效果都會用到透明效果,也因此讓過度繪製狀況更明顯。這種情況下,您可以減少要轉譯的透明物件數量,藉此改善過度繪製情況。舉例來說,如果想獲得灰色文字,您可以在 TextView 繪製黑色文字,再設定透明的 Alpha 值。但是只要直接繪製灰色文字,就能得到一樣的效果,卻能大幅改善效能。

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