iOS 離屏渲染的研究

2021-07-22 06:15:02 字數 1627 閱讀 7848



gpu螢幕渲染有以下兩種方式:

on-screen rendering意為當前螢幕渲染,指的是gpu的渲染操作是在當前用於顯示的螢幕緩衝區中進行。

離屏渲染的觸發方式

設定了以下屬性時,都會觸發離屏繪製:

shouldrasterize(光柵化)

masks(遮罩)

shadows(陰影)

edge antialiasing(抗鋸齒)

group opacity(不透明)

複雜形狀設定圓角等

漸變其中shouldrasterize(光柵化)是比較特別的一種:光柵化概念:將圖轉化為乙個個柵格組成的圖象。光柵化特點:每個元素對應幀緩衝區中的一畫素。

shouldrasterize = yes在其他屬性觸發離屏渲染的同時,會將光柵化後的內容快取起來,如果對應的layer及其sublayers沒有發生改變,在下一幀的時候可以直接復用。shouldrasterize = yes,這將隱式的建立乙個位圖,各種陰影遮罩等效果也會儲存到位圖中並快取起來,從而減少渲染的頻度(不是向量圖)。

相當於光柵化是把gpu的操作轉到cpu上了,生成位圖快取,直接讀取復用。

當你使用光柵化時,你可以開啟「color hits green and misses red」來檢查該場景下光柵化操作是否是乙個好的選擇。綠色表示快取被復用,紅色表示快取在被重複建立。

如果光柵化的層變紅得太頻繁那麼光柵化對優化可能沒有多少用處。位圖快取從記憶體中刪除又重新建立得太過頻繁,紅色表明快取重建得太遲。可以針對性的選擇某個較小而較深的層結構進行光柵化,來嘗試減少渲染時間。

注意: 對於經常變動的內容,這個時候不要開啟,否則會造成效能的浪費

例如我們日程經常打交道的tableviewcell,因為tableviewcell的重繪是很頻繁的(因為cell的復用),如果cell的內容不斷變化,則cell需要不斷重繪,如果此時設定了cell.layer可光柵化。則會造成大量的離屏渲染,降低圖形效能。

為什麼會使用離屏渲染

當使用圓角,陰影,遮罩的時候,圖層屬性的混合體被指定為在未預合成之前不能直接在螢幕中繪製,所以就需要螢幕外渲染被喚起。

螢幕外渲染並不意味著軟體繪製,但是它意味著圖層必須在被顯示之前在乙個螢幕外上下文中被渲染(不論cpu還是gpu)。

所以當使用離屏渲染的時候會很容易造成效能消耗,因為在opengl裡離屏渲染會單獨在記憶體中建立乙個螢幕外緩衝區並進行渲染,而螢幕外緩衝區跟當前螢幕緩衝區上下文切換是很耗效能的。

color offscreen-rendered yellow開啟後會把那些需要離屏渲染的圖層高亮成黃色,這就意味著黃色圖層可能存在效能問題。

color hits green and misses red如果shouldrasterize被設定成yes,對應的渲染結果會被快取,如果圖層是綠色,就表示這些快取被復用;如果是紅色就表示快取會被重複建立,這就表示該處存在效能問題了。

ios版本上的優化

ios 9.0 之前uiimageview跟uibutton設定圓角都會觸發離屏渲染

ios 9.0 之後uibutton設定圓角會觸發離屏渲染,而uiimageview裡png設定圓角不會觸發離屏渲染了,如果設定其他陰影效果之類的還是會觸發離屏渲染的。

這可能是蘋果也意識到離屏渲染會產生效能問題,所以能不產生離屏渲染的地方蘋果也就不用離屏渲染了。

iOS 離屏渲染研究

gpu渲染機制 gpu螢幕渲染有以下兩種方式 離屏渲染的觸發方式 設定了以下屬性時,都會觸發離屏繪製 其中shouldrasterize 光柵化 是比較特別的一種 光柵化概念 將圖轉化為乙個個柵格組成的圖象。光柵化特點 每個元素對應幀緩衝區中的一畫素。shouldrasterize yes在其他屬性...

iOS 離屏渲染的研究

gpu渲染機制 gpu螢幕渲染有以下兩種方式 離屏渲染的觸發方式 設定了以下屬性時,都會觸發離屏繪製 其中shouldrasterize 光柵化 是比較特別的一種 光柵化概念 將圖轉化為乙個個柵格組成的圖象。光柵化特點 每個元素對應幀緩衝區中的一畫素。shouldrasterize yes在其他屬性...

iOS之離屏渲染

on screen rendering 意為當前螢幕渲染,指的是gpu的渲染操作是在當前用於顯示的螢幕緩衝區中進行。off screen rendering 意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作。特殊的離屏渲染 如果將不在gpu的當前螢幕緩衝區中進行的渲染都稱為...