iOS 离屏渲染

2020-07-08  本文已影响0人  爱闹的凡

1、造成离屏渲染的几种方式

使用了 mask 的 layer (layer.mask)
需要进行裁剪的 layer (layer.masksToBounds /view.clipsToBounds和layer.cornerRadius>0)
设置了组透明度为 YES,并且透明度不为 1 的layer (layer.allowsGroupOpacity/ layer.opacity)
添加了投影的 layer (layer.shadow*)
采用了光栅化的 layer (layer.shouldRasterize)
绘制了文字的 layer (UILabel, CATextLayer, Core Text 等)

2、如何设置圆角才会触发离屏渲染

我们经常看到,圆角会触发离屏渲染。但其实这个说法是不准确的,因为圆角触发离屏渲染也是有条件的!

我们先来看看苹果官方文档对于cornerRadius的描述:

Setting the radius to a value greater than 0.0 causes the layer to begin drawing rounded corners on its background. By default, the corner radius does not apply to the image in the layer’s contents property; it applies only to the background color and border of the layer. However, setting the masksToBounds property to true causes the content to be clipped to the rounded corners.

我们发现设置cornerRadius大于0时,只为layer的backgroundColorborder设置圆角;而不会对layer的contents设置圆角,除非同时设置了layer.masksToBoundstrue(对应UIView的clipsToBounds属性)。

如果这时,你认为layer.masksToBounds或者clipsToBounds设置为true就会触发离屏渲染,这是不完全正确的。

我们先打开模拟器的离屏渲染颜色标记:

[图片上传中...(Snip20200708_10.png-d8fa3c-1594200161384-0)]


image

如下1/4为离屏渲染标记:


Snip20200708_10.png

2. 圆角触发离屏渲染的真正原因

图层的叠加绘制大概遵循“画家算法”。

油画算法:先绘制场景中的离观察者较远的物体,再绘制较近的物体。

先绘制红色部分,再绘制⻩色部分,最后再绘制灰⾊部分,即可解决隐藏面消除的问题。即将场景按照物理距离和观察者的距离远近排序,由远及近的绘制即可。

14960689-474c7f2dc877d8ef.png

当我们设置了cornerRadius以及masksToBounds进行圆角+裁剪时,masksToBounds裁剪属性会应用到所有的图层上。

image

本来我们从后往前绘制,绘制完一个图层就可以丢弃了。但现在需要依次在 Offscreen Buffer中保存,等待圆角+裁剪处理,即引发了 离屏渲染

3、如何设置圆角的时候避免离屏渲染

主要避免多图层需要计算组合展示的情况:
1、给button设置图片并设置圆角,可以直接给button的姿势图image view 进行设置 button.imageView.layer.cornerRidus
2、避免多层 alpha<1.0的叠加操作
3、使用imageView设置图片并设置圆角时不要设置imageView的backgroundColor

若还有其他情况欢迎留言补充,谢谢

上一篇 下一篇

猜你喜欢

热点阅读