版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pk_sir/article/details/78216641
1-Color Blended Layers (图层混合)
这个选项是检测哪里发生了图层混合,先介绍一下什么是图层混合?很多情况下,界面都是会出现多个UI控件叠加的情况,如果有透明或者半透明的控件,那么GPU会去计算这些这些layer最终的显示的颜色,也就是我们肉眼所看到的效果。例如一个上层Veiw颜色是绿色RGB(0,255,0),下层又放了一个View颜色是红色RGB(0,0,255),透明度是50%,那么最终显示到我们眼前的颜色是蓝色RGB(0,127.5,127.5)。这个计算过程会消耗一定的GPU资源损耗性能。如果我们把上层的绿色View改为不透明, 那么GPU就不用耗费资源计算,直接显示荧光绿色。
混合颜色计算公式:
R(C)=alpha*R(B)+(1-alpha)*R(A) R(x)、G(x)、B(x)分别指颜色x的RGB分量
在 Color Blended Layers (图层混合)
模式下,如果界面出现混合图层,那么该控件会显示成红色。如下图:
如何消除这些 混合图层呢?设置一个不透明的背景颜色就可以了
;self.lab2.backgroundColor = self.lab2.superview.backgroundColor;
self.lab2.layer.masksToBounds = YES;//单独设置不会离屏渲染
细心的朋友可能会注意到为什么要设置masksToBounds = YES
?
这是因为 label的内容是中文,label实际渲染区域要大于label的size,最外层多了一个sublayer。
然后是设置 maskToBounds
英文不需要设置 maskToBounds
注意点:UIImageView,本身不透明,并且它的内容图片image 也必须是不透明的。
如果UIImageView红色图层混合,就应该排查自己的代码和图片自身的问题了。先吃饭,下午继续
我回来了,继续!
2- Color Offscreen-Rendered Yellow(离屏渲染)
我发现! 在iOS 11上设置
; self.lab1.layer.masksToBounds = YES;
self.lab1.layer.cornerRadius = 5;
//设置这两个属性居然没有出现离屏渲染,我猜是iOS 11做了处理吧,
如下图
但是在iOS 11以前是会出现的 可能是某个环节出现了错误,还在排查中,欢迎指出:
由于测试机全是iOS 11的,所以去其他地方找了点资料:
离屏渲染Off-Screen Rendering 指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。还有另外一种屏幕渲染方式-当前屏幕渲染On-Screen Rendering ,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。 离屏渲染会先在屏幕外创建新缓冲区,离屏渲染结束后,再从离屏切到当前屏幕, 把离屏的渲染结果显示到当前屏幕上,这个上下文切换的过程是非常消耗性能的,实际开发中尽可能避免离屏渲染。
触发离屏渲染Offscreen rendering的行为:
(1)drawRect:方法
(2)layer.shadow
(3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
(4)layer.shouldRasterize
(5)layer.mask
(6)layer.masksToBounds && layer.cornerRadius
这里有需要注意的是第三条layer.shouldRasterize ,其实就是我们本文讲的第三个选项光栅化,光栅化会触发离屏渲染,因此光栅化慎用。
前面说到 设置圆角会触发离屏渲染,设置圆角触发离屏渲染要同时满足下面两个条件:
;layer.masksToBounds = YES;
;layer.cornerRadius = 5;
如果在某个页面大量使用了圆角,会非常消耗性能造成FPS急剧下降
3-Color Misaligned Images(图片大小)
这个选项检查了图片是否被放缩,像素是否对齐。被放缩的图片会被标记为黄色,像素不对齐则会标注为紫色。