一、渲染機制
CPU將計算好的需要顯示的內容提交給GPU,GPU渲染完成后將渲染結果放入幀緩沖區,隨后視頻控制器會按照Vsync(垂直脈沖)信號逐行讀取幀緩沖區的數據,經過可能的數模轉換傳遞給顯示器進行顯示。
二、GPU屏幕渲染有兩種方式
離屏渲染Off-Screen Rendering 指的是GPU在當前屏幕緩沖區以外新開辟一個緩沖區進行渲染操作。離屏渲染結束后,再從離屏切到當前屏幕
當前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在當前用於顯示的屏幕緩沖區中進行。
三、以下方式會觸發離屏幕渲染
1.使用系統提供的圓角效果也會觸發離屏渲染.
(masksToBounds = true&&cornerRadius>0才會引發離屏渲染)
2.重寫drawRect
3.layer.shadow
(Shawdow 可以通過指定路徑來取消離屏渲染)
4.layer.mask
(Mask 效果無法取消離屏渲染,使用混合圖層的方法來模擬 mask 效果,性能各方面都是和無效果持平。)
5.layer.allowsGroupOpacity
(GroupOpacity 是指 CALayer 的allowsGroupOpacity屬性,UIView 的alpha屬性等同於 CALayer opacity屬性,
開啟離屏渲染的條件是:layer.opacity != 1.0並且有子 layer 或者背景圖。)
layer.allowsEdgeAntialiasing
開啟離屏渲染的條件是:layer.opacity != 1.0並且有子 layer 或者背景圖。)
layer.allowsEdgeAntialiasing
(該屬性用於消除鋸齒,離屏渲染條件旋轉視圖並且設置layer.allowsEdgeAntialiasing = true)
6.layer.shouldRasterize
(光柵化會觸發離屏渲染,開啟 Rasterization=true 后,GPU 只合成一次內容,然后復用合成的結果;合成的內容超過 100ms 沒有使用會從緩存里移除,在更新內容時還會產生更多的離屏渲染。對於內容不發生變化的視圖,原本拖后腿的離屏渲染就成為了助力)
四、如何檢測離屏渲染
1.模擬器
模擬器在工作欄上面的Debug -> Color Off-Screen Rendered
2.真機
真機在工作欄上面的Debug -> View Debugging -> Rendering -> Color Off-Screen Rendered Yellow