iOS離屏渲染之優化分析

2022-07-05 13:00:13 字數 3474 閱讀 5252

在進行ios的應用開發過程中,有時候會出現卡頓的問題,雖然ios裝置的效能越來越高,但是卡頓的問題還是有可能會出現,而離屏渲染是造成卡頓的原因之一。因此,本文主要分析一下離屏渲染產生的原因及避免的方法,最後介紹一下xcode自帶的分析離屏渲染的工具instruments的使用。

calayer繼承自nsobject類,負責顯示uiview提供的內容contentscalayer有三個視覺元素:背景色、內容和邊框,其中,內容的本質是乙個cgimage

下圖為calayer的結構圖:

介面渲染過程

runloop有乙個60fps的**,即每16.7ms繪製一次螢幕,所以view的繪製必須在這個時間內完成,view內容的繪製是cpu的工作,然後把繪製的內容交給gpu渲染,包括多個view的拼接(compositing)、紋理的渲染(texture)等等,最後顯示在螢幕上。但是,如果無法是16.7ms內完成繪製,就會出現丟幀的問題,一般情況下,如果幀率保證在30fps以上,介面卡頓效果不明顯,那麼就需要在33.4ms內完成view的繪製,而低於這個幀率,就會產生卡頓的效果,影響體驗。

渲染的過程如下:

在使用圓角、陰影和遮罩等檢視功能的時候,圖層屬性的混合體被指定為在未預合成之前不能直接在螢幕中繪製,所有就需要在螢幕外的上下文中渲染,即離屏渲染。

離屏渲染卡頓原因

離屏渲染之所以會特別消耗效能,是因為要建立乙個螢幕外的緩衝區,然後從當屏緩衝區切換到螢幕外的緩衝區,然後再完成渲染;其中,建立緩衝區和切換上下文最消耗效能,而繪製其實不是效能損耗的主要原因。

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

螢幕渲染型別

螢幕渲染有如下三種:

gpu中的螢幕渲染:

1、on-screen rendering

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

2、off-screen rendering

意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作

3、cpu中的離屏渲染(特殊離屏渲染,即不在gpu中的渲染)

如果我們重寫了drawrect方法,並且使用任何core graphics的技術進行了繪製操作,就涉及到了cpu渲染

coregraphic通常是執行緒安全的,所以可以進行非同步繪製,顯示的時候再放回主線程

方法一

使用cornerradius進行切圓角,在ios9之前會產生離屏渲染,比較消耗效能,而之後系統做了優化,則不會產生離屏渲染,但是操作最簡單

iv.layer.cornerradius = 30;

iv.layer.maskstobounds = yes;

方法二

利用mask設定圓角,利用的是uibezierpathcashapelayer來完成

cashapelayer *mask1 = [[cashapelayer alloc] init];

mask1.opacity = 0.5;

mask1.path = [uibezierpath bezierpathwithovalinrect:iv.bounds].cgpath;

iv.layer.mask = mask1;

方法三

利用coregraphics畫乙個圓形上下文,然後把繪製上去,得到乙個圓形的,達到切圓角的目的。

- (uiimage *)drawcircleimage:(uiimage*)image

ios的效能除錯有許多方法,而官方提供的instruments是乙個強大的效能除錯工具,可以分析如下功能:記憶體、核心動畫、自動化、布局、網路等等,本文主要介紹一下利用core animation來分析應用的效能問題。

下面介紹一下core animation中的debug屬性的部分功能,這些功能在分析離屏渲染等效能問題時十分有用:

color blended layers

這個選項基於渲染程度對螢幕中的混合區域進行綠到紅的高亮(也就是多個半透明圖層的疊加)。由於重繪的原因,混合對gpu效能會有影響,同時也是滑動或者動畫幀率下降的罪魁禍首之一

color hits green and misses red

當設定shouldrasterizep屬性為yes的時候,耗時的圖層繪製會被快取,然後當做乙個簡單的扁平呈現。當快取再生的時候這個選項就用紅色對柵格化圖層進行了高亮。如果快取頻繁再生的話,就意味著柵格化可能會有負面的效能影響了

color offscreen-rendered yellow

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

當然debug還有其它的選項,來分析不同的效能問題,如有需求,請參考其它資料。

參考資料

ios 離屏渲染的研究

ios離屏渲染優化(附demo)

ios設定圓角效能優化

ios --- uiview與calayer的聯絡與區別

ios開發之圖形渲染分析、離屏渲染、當前螢幕渲染、on-screen rendering、off-screen rendering

ios-core-animation之十二----效能調優

iOS之離屏渲染

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

iOS 離屏渲染研究

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

iOS 筆記 離屏渲染

gpu渲染機制 特殊的離屏渲染 如果將不在gpu的當前螢幕緩衝區中進行的渲染都稱為離屏渲染,那麼就還有另一種特殊的 離屏渲染 方式 cpu渲染。完成,渲染得到的bitmap最後再交由gpu用於顯示。備註 coregraphic通常是執行緒安全的,所以可以進行非同步繪製,顯示的時候再放回主線程,乙個簡...