1. 程式人生 > >混合和過度繪制(圖層性能 15.3)

混合和過度繪制(圖層性能 15.3)

back 背景 編譯器 class 會有 顏色 anim 屬性設置 都去

混合和過度繪制

在第12章有提到,GPU每一幀可以繪制的像素有一個最大限制(就是所謂的fill rate),這個情況下可以輕易地繪制整個屏幕的所有像素。但是如果由於重疊圖層的關系需要不停地重繪同一區域的話,掉幀就可能發生了。

GPU會放棄繪制那些完全被其他圖層遮擋的像素,但是要計算出一個圖層是否被遮擋也是相當復雜並且會消耗處理器資源。同樣,合並不同圖層的透明重疊像素(即混合)消耗的資源也是相當客觀的。所以為了加速處理進程,不到必須時刻不要使用透明圖層。任何情況下,你應該這樣做:

  • 給視圖的backgroundColor屬性設置一個固定的,不透明的顏色
  • 設置opaque屬性為YES

這樣做減少了混合行為(因為編譯器知道在圖層之後的東西都不會對最終的像素顏色產生影響)並且計算得到了加速,避免了過度繪制行為因為Core Animation可以舍棄所有被完全遮蓋住的圖層,而不用每個像素都去計算一遍。

如果用到了圖像,盡量避免透明除非非常必要。如果圖像要顯示在一個固定的背景顏色或是固定的背景圖之前,你沒必要相對前景移動,你只需要預填充背景圖片就可以避免運行時混色了。

如果是文本的話,一個白色背景的UILabel(或者其他顏色)會比透明背景要更高效。

最後,明智地使用shouldRasterize屬性,可以將一個固定的圖層體系折疊成單張圖片,這樣就不需要每一幀重新合成了,也就不會有因為子圖層之間的混合和過度繪制的性能問題了。

混合和過度繪制(圖層性能 15.3)