Instruments 中 Core Animation优化(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
中文设置  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.shadow3)layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing4)layer.shouldRasterize5)layer.mask6)layer.masksToBounds && layer.cornerRadius
这里有需要注意的是第三条layer.shouldRasterize ,其实就是我们本文讲的第三个选项光栅化,光栅化会触发离屏渲染,因此光栅化慎用。
前面说到 设置圆角会触发离屏渲染,设置圆角触发离屏渲染要同时满足下面两个条件:
;layer.masksToBounds = YES;
;layer.cornerRadius = 5;

如果在某个页面大量使用了圆角,会非常消耗性能造成FPS急剧下降

3-Color Misaligned Images(图片大小)
这个选项检查了图片是否被放缩,像素是否对齐。被放缩的图片会被标记为黄色,像素不对齐则会标注为紫色。

猜你喜欢

转载自blog.csdn.net/pk_sir/article/details/78216641