iOS離屏渲染的相關(guān)問(wèn)題

本篇我們記錄一下幾個(gè)問(wèn)題
1、什么是離屏渲染
2、離屏渲染是在哪一步進(jìn)行的
3、離屏渲染的影響
4、哪些操作會(huì)造成離屏渲染
5、離屏渲染的優(yōu)化
6、特殊的離屏渲染
7、UILabel的特殊之處

1、什么是離屏渲染

離屏渲染的解釋

2、離屏渲染是在哪一步進(jìn)行的


圖像顯示過(guò)程

不能直接顯示為 frameBuffer,會(huì)先開(kāi)辟一塊內(nèi)存空間由GPU合成顯示相關(guān)的視圖,需要顯示的時(shí)候 再合成frameBuffer,是需要上下文來(lái)回切換,耗費(fèi)性能

3、離屏渲染的影響

  • 需要額外開(kāi)辟一塊內(nèi)存空間
  • 上下文切換 耗費(fèi)性能
    4、哪些操作會(huì)造成離屏渲染

iOS模擬器開(kāi)啟Color Off-screen rendered,之后 =觸發(fā)離屏渲染的會(huì)顯示黃色


截屏2024-03-12 18.37.38.png
  • 光柵化
    將試圖緩存為一個(gè)bitmap的位圖,使用的時(shí)候直接獲取位圖,開(kāi)發(fā)過(guò)程中基本沒(méi)有使用場(chǎng)景


    截屏2024-03-12 15.27.26.png
  • mask遮罩
    mask是在視圖的上層添加一個(gè)layer,顯示的時(shí)候需要主視圖 + mask綜合顯示 觸發(fā)離屏渲染


    截屏2024-03-12 15.30.03.png
  • 陰影
    陰影是在主視圖的底下 處理的,顯示也需要綜合于主視圖,綜合顯示


    截屏2024-03-12 15.31.58.png
  • 抗鋸齒
    這個(gè)與圖片的顯示模式有關(guān)系,若是圖片顯示模式為scaleToFill,就不會(huì)觸發(fā)離屏渲染


    截屏2024-03-12 15.40.58.png
  • 不透明度
    單純的設(shè)置不透明度是不會(huì)觸發(fā)離屏渲染的,但是若是主視圖上有子視圖,我們?cè)O(shè)置主視圖的不透明度小于1,就會(huì)觸發(fā)離屏渲染


    不觸發(fā)

    觸發(fā)
  • 圓角


    不觸發(fā)

    觸發(fā)

    UILabel設(shè)置了 layer.backgroudColor才會(huì)觸發(fā)


    截屏2024-03-12 18.10.04.png
  • 貝塞爾曲線,不會(huì)觸發(fā)離屏渲染 但是也不是最優(yōu)解,這個(gè)會(huì)增加繪制成本,最優(yōu)解是在原圖片上加一個(gè)透明的圓角層


    截屏2024-03-12 18.10.43.png

5、離屏渲染的優(yōu)化

  • 陰影的優(yōu)化
    設(shè)置layer的shadowPath


    截屏2024-03-12 18.27.32.png
  • 圓角設(shè)置注意事項(xiàng),僅設(shè)置圓角不會(huì)觸發(fā)離屏渲染


    截屏2024-03-12 18.08.57.png

imageView設(shè)置了backgroudColor后會(huì)觸發(fā)離屏渲染


![截屏2024-03-12 18.10.43.png](https://upload-images.jianshu.io/upload_images/1258716-dc7a56484535b2a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

截屏2024-03-12 18.09.18.png

6、特殊的離屏渲染,xcode檢測(cè)不出來(lái)

截屏2024-03-12 18.12.34.png

drawRect方法,這個(gè)地方會(huì)重新生成backing srore,增加繪制成本

7、UILabel的特殊之處

截屏2024-03-12 18.10.04.png

imageview和label顯示出來(lái)的顏色分別為 green和red


截屏2024-03-12 15.21.59.png

一般的uiview我們?cè)O(shè)置backgroudcolor設(shè)置的是 contents后邊的顏色,layer.backgroudcolor是contents的顏色,
但是UILabel則不然,我們?cè)O(shè)置backgroudColor是contents的顏色,layer.backgroudcolor是底部的顏色
圖中所示的 backgroudColor、contents、borderWidth&borderColor,任意設(shè)置兩個(gè)都會(huì)觸發(fā)離屏渲染

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容