Core Animation
Color blended layers (像素混合)
主要是图层的不透明造成的影响,因为几个透明图层的叠加,CPU要计算出一个图层是否被遮挡,会消耗很多CPU资源,而且合并这些图层也会花很多资源。把opaque设置为YES后会减少很多不必要的计算。
标志红色的为混合图层,绿色的为不混合图层(绿色越多越好)
1.设置图层的opaque为YES,设置背景颜色不为透明。
2.UILabel若是内容显示的是中文,图层还是显示红色,这时候只要加上label.layer.masksToBounds = YES,图层将会沿着bounds进行裁剪,就会发现lable图层变成绿的,表示像素混合的问题已经解决了。
3.美工在切图的时候,尽量不要切出带有透明的图片,要不然在显示图片的时候还是出现像素混合问题。
Color Hits Green and Misses Red(光栅栏缓存)
很多视图的layer的Shadow、Mask和Gradient等原因渲染很高,而UIKit提供了API来缓存这些layer,self.layer.shouldRasterize = YES会将这些layer缓存成bitmap位图供渲染使用。图层Rasterization栅格化好处是对刷新率影响较小,坏处是删格化处理后的Bitmap缓存需要占用内存,而且当图层需要缩放时,要对删格化后的Bitmap做额外计算。 使用这个选项后时,如果Rasterized的Layer失效,便会标注为红色,如果有效标注为绿色。当测试的应用频繁闪现出红色标注图层时,表明对图层做的Rasterization作用不大。在测试的过程中,第一次加载时,开启光栅化的layer会显示为红色,这是很正常的,因为还没有缓存成功。但是如果在接下来的测试,。例如我们来回滚动TableView时,我们仍然发现有许多红色区域,那就需要谨慎对待了。
Color Copied Images
主要是检查我们是否使用正确的图片格式,若是不正确的图片,图片会显示青色。若是GPU不支持的色彩格式图片,则只能由CPU来处理,而CPU会生成一些图片发送给渲染服务器。这导致滑动的时候还要占用CPU去处理这些问题,导致主线程卡顿。
Color Non-Standard Surface Formats(不标准的表面颜色格式)
选了之后项目里面的一些按钮会出现灰色(这个我目前还是不懂)
Color Immediately(颜色立即更新)
通常 Core Animation 以每秒10此的频率更新图层的调试颜色,对于某些效果来说,这可能太慢了,这个选项可以用来设置每一帧都更新(可能会影响到渲染性能,所以不要一直都设置它)
Color Misaligned Images (像素不齐)
一般都是下载的网络图片尺寸跟控件尺寸不一致导致图片压缩,图片标志黄色,若是像素不对齐,则标志紫色。(有些页面的文本也爆紫色,就是不知道是什么问题,解决不了。)
Color Offscreen-Rendered Yellow(离屏渲染)
CPU或是GPU在当前屏幕缓冲区以外新开辟一个缓冲区来进行渲染操作。过程中需要切换contexts,切换过程十分耗性能。GPU 产生的离屏渲染主要是当 CALayer 使用圆角,阴影,遮罩等属性的的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中渲染,则过程中需要进行离屏渲染。
若是图层标志黄色,则是离屏渲染。
Color Compositing Fast-Path Blue
会对任何直接使用OpenGL绘制的图层进行高亮,如果仅仅使用UIKit或者Core Animation的API,不会有任何效果。(我还真没遇过,看来能力还是有限)
Flash Updated Regions(重绘区域)
对重绘的图层标志高亮黄色(例如:[tableview reloadData]会发现整个tableview都是高亮黄色的),重绘区域越小越好。
结论
上面的优化都使用了,但是结果FPS还是没有达到59~60,只达到56~59。不知道网上看到的那些demo是怎么达到的,我的代码已经是简化的不能再简化了。然后我又创建了一个项目,只有一个tableView,但是FPS也是58左右而已。