图像的显示原理:
由CPU计算提交到GPU进行渲染引入到帧缓存区,随后视频控制器会按照VSync(垂直同步信号)逐行读取帧缓存区的数据,经过可能的数模转换传递给显示器显示。
CPU资源消耗原因和解决方案:
1、对象的创建:对象的创建会分配内存,调整属性,甚至读取文件等操作,比较消耗CPU资源。在创建的时候可以尽量选择轻量级的对象来代替重量级的对象,这样就可以对性能有所优化。比如CALayer就比UIView要轻量级许多,那么不需要响应对象的触摸时间的控件,可以用CALayer显示会更加的合适。通过SB创建视图对象,其消耗的资源比远远大于通过代码创建对象,在性能比较敏感的界面,尽量不要使用SB。
2、对象的调整:对象的调整会消耗CPU资源。在性能优化的时尽量避免调整视图层次,添加和移除视图。
3、对象的销毁:主要是针对于容器类的释放,如存放大量数据的字典或者是数组对象。
4、布局计算:
autolayout:对于复杂的视图使用它就会很消耗CPU
如果你对文本显示没有特殊要求,可以参考下 UILabel 内部的实现方式:用 [NSAttributedString boundingRectWithSize:options:context:] 来计算文本宽高,用 -[NSAttributedString drawWithRect:options:context:] 来绘制文本。
文本渲染:在底层都是通过CoreText排版,绘制为Bitmap显示。
图片的解码:图片解码都是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到CGBitmapContext中,然后从Bitmap直接创建图片。
图像的绘制:一般都是痛UIView的DrawRect方法进行绘制的。
GPU资源消耗原因和解决方案:
相对CPU来说,GPU干的事情比较单一。它可以提交纹理,顶点描述,应用变换,混合并渲染。
1、纹理的渲染:所有的Bitmap,包括图片,文本,栅格化的内容,最终都要由内存提交到显存,绑定为GPU的Texture。注意:不要超过GPU的最大纹理尺寸。4096 x 4096
2、视图的混合:对于多个视图的重叠显示。
3、图形的生成:当一个列表里面出现大量的CALayer,并且快速滑动时。最彻底的解决方法就是把需要显示的图形在后台线程绘制为图片,避免使用圆角,阴影,遮罩等属性。