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

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

不能直接顯示為 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ì)顯示黃色

-
光柵化
將試圖緩存為一個(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ā)離屏渲染


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

drawRect方法,這個(gè)地方會(huì)重新生成backing srore,增加繪制成本
7、UILabel的特殊之處

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

一般的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ā)離屏渲染











