離屏渲染概念
離屏渲染,根據字面意思理解,就是脫離螢幕的渲染,渲染的結果不會直接呈現到當前螢幕上,而是等待時機才會被顯示
正常情況,在當前螢幕顯示的內容,由GPU渲染完成後放到當前螢幕的幀快取區,不需要額外的渲染空間。iphone的螢幕重新整理率是60HZ,每隔一段時間就會從幀緩衝區讀取一次資料顯示到當前螢幕上
當GPU遇到效能瓶頸,導致無法在一幀內更新渲染結果到幀快取區,此時螢幕重新整理從幀快取區讀取到的還是上一幀的內容,表現出介面卡頓的效果
為了解決上面出現的情況,避免因為介面佈局複雜導致GPU渲染效能出現問題,導致介面卡頓的情況,Apple引入了離屏渲染的機制,它會處理比較消耗效能的檢視提前渲染
如何觸發離屏渲染
GPU渲染沒有辦法做到一步到位,就會觸發離屏渲染
1、圓角
2、陰影
3、遮罩
4、背景色
5、透明度
離屏渲染的弊端
離屏渲染需要在記憶體中單獨開闢一段記憶體空間,提前使用GPU渲染複雜的檢視,保證能夠及時地從快取區讀取最新的渲染結果。其實離屏渲染是讓CPU幫助GPU處理了一部分事情,減輕GPU的壓力。螢幕要想讀取離屏渲染的結果,需要在當前螢幕快取區和離屏渲染快取區來回切換,這樣也會產生系統開銷,間接的降低了App的效能
在tableview或者collection中,滾動的每一幀變化都會觸發每個cell的重新繪製,一旦出現離屏渲染,上下文不停的切換,每秒發生60次,這樣會大大降低GPU的渲染效能
如何最佳化離屏渲染
1、使用cornerRadius設定了圓角,儘量不設定背景色,儘量不給borderWidth賦值
2、能夠用圓角圖片就別用cornerRadius設定圓角
3、設定陰影,使用shadowPath來規避離屏渲染
4、複雜、複用度高的檢視,使用layer mask並開啟shouldRasterize來對渲染結果進行快取
5、設定layer的opaque為YES,減少複雜圖層合成
6、儘量使用不包含透明通道的圖片資源(alpha<1)