簡化繪畫複雜度並減少顏料區域

Paul Lewis

填充像素的過程稱為繪圖,最終會合成到使用者的螢幕上。這通常是管道中執行時間最長的任務,因此盡量避免使用。

摘要

  • 變更轉換或透明度以外的任何屬性,一律會觸發繪圖。
  • 繪圖通常是像素管道中耗用資源最多的部分。盡量避免使用。
  • 透過圖層升級和動畫的協調,減少繪圖區域。
  • 使用 Chrome 開發人員工具的繪圖剖析器評估繪圖複雜度和成本,並盡可能降低。

版面配置和繪製作業的觸發方式

如果觸發版面配置,您會一律觸發繪圖,因為變更任何元素的幾何圖形意味著其像素需要修正!

完整像素管道。

變更非幾何屬性 (例如背景、文字顏色或陰影) 時,也會觸發繪圖作業。在這種情況下,您不需要版面配置,管道會如下所示:

沒有版面配置的像素管道。

使用 Chrome 開發人員工具快速找出繪製瓶頸

您可以使用 Chrome 開發人員工具快速找出正在繪製的區域。開啟「算繪」分頁,然後啟用「閃爍繪圖」

啟用這個選項後,Chrome 會在繪製時閃爍綠色畫面。如果整個畫面都閃爍綠色,或是畫面上有您認為不應著色的區域,那麼您就需要進一步查看。

每次繪製時,網頁都會閃爍綠色。

宣傳會移動或淡出的元素

記憶體中的單張圖像不一定都會繪製完成。事實上,瀏覽器可以視需要將圖片繪製到多張圖片或合成器圖層。

合成器圖層的表示法。

這種做法的好處是可以處理定期重新繪製的元素,或以轉換方式移動到螢幕上的元素,而且不會影響其他元素。這與 Sketch、GIMP 或 Photoshop 等繪圖套件相同,在這些套件中,您可以處理個別圖層,並將圖層重疊合成最終圖片。

建立新圖層的最佳方法,就是使用 will-change CSS 屬性,這項屬性可在所有主要的新型瀏覽器引擎中使用。使用 transform 的值,will-change 會建立新的合成器圖層:

.moving-element {
  will-change: transform;
}

不過,請務必小心不要建立太多圖層,因為每個圖層都需要記憶體和管理。如需更多資訊,請參閱「只使用合成器專屬屬性並管理圖層數量」一節。

如果您已將元素升級至新圖層,請使用 DevTools 確認這項操作是否帶來效能優勢。請勿在未進行剖析的情況下宣傳元素。

減少繪製區域

不過,有時即使提升元素,還是需要進行繪圖作業。繪製問題的一大挑戰,在於瀏覽器會將兩個需要繪製的區域合併,導致整個畫面都需要重新繪製。舉例來說,如果您在頁面頂端使用固定標題,且畫面底部有其他內容,整個畫面可能就會重新繪製。

減少繪製區域通常是指協調動畫和轉場,避免重疊,或是找出方法,避免繪製網頁的特定部分。

簡化繪製複雜度

部分螢幕填滿所需要的時間。

在繪畫方面,有些東西比其他東西貴。舉例來說,任何涉及模糊處理的效果 (例如陰影) 都會比繪製紅色方塊需要更長的時間。不過,在 CSS 方面,這並非一目瞭然:background: red;box-shadow: 0, 4px, 4px, rgba(0,0,0,0.5); 的效能特性看起來不一定有太大差異,但實際上確實如此。

如上一個螢幕截圖所示,您可以使用繪圖分析器判斷是否需要尋找其他方法來達到效果。然後問問自己,是否能夠用更便宜的樣式或其他方式,來獲得最終成果。

請盡量避免在動畫期間進行繪圖,因為每個影格有 10 毫秒的時間通常不足以完成繪圖作業,尤其是在行動裝置上。