iOS页面图层性能和页面卡顿的原因
iOS系统如何把图像内容展示到屏幕,呈现到我们的面前?为什么APP会感觉卡顿?
iOS系统的手机呈现内容到展示,需要先了解CPU和GPU,因为两者的共同参与,我们才能看到APP的内容展示.CPU我们很好理解,但还是要说一下:CPU负责计算显示内容,视图的创建,布局的计算,图片解码,文本绘制都是通过CPU计算出来.那这个GPU是什么?GPU负责把CPU计算出的结果变换合成渲染,然后呈递给帧缓冲区,等待VSync信号到来,才会有我们看到APP的内容.所谓的页面卡顿是因为垂直同步机制,在一个VSync时间内,CPU或者GPU没有完成内容的提交,导致这一帧丢失了,而下一个VSync时间到来不会把上一帧所丢失的内容在做一遍,所以在下一个VSync时间的显示之前,屏幕会保留之前的内容不变.
为了平衡CPU和GPU的负荷运算,不要在两者任何一方做负荷运算.
CPU负荷任务
1.计算布局
2.对象创建
3.autolayout复杂的页面会消耗CPU,增加负荷
4.文本计算:文本长宽高比如cell里文本的计算
5.文本控件label,textField,textView,webView,其排版和绘制都是在主线程进行,当显示大量文本时,会很大的消耗CPU.包含文本的视图在改变布局时会触发文本重新渲染,对于静态文本我们应该要尽量减少它所在视图的布局修改
6.图像的绘制,图像绘制我会在之后详细讲解动画的分享文章中细说,CG开头方法消耗CPU资源,我们可以将绘制过程放在后台线程,然后在主线程里讲结果设置到layer的contents中
7.图片的解码 imageNamed加载图片后会立即解码然后系统会缓存起来,有一个问题是我们不知道这个图片何时会释放掉,这个缓存策略没有公开.
GPU负荷任务
GPU任务单一,接收提交纹理,点的描述,应用变换,渲染.大体上讲CAlayer的属性大多数都是GPU绘制.GPU之后我会具体用代码补充进来看下效果,就很明显了,先说大概几点:
避免GPU负荷的几点:
1.不要有大量的几何结构,减少在短时间大量图片的显示
2.避免视图的混合,减少透明的视图
3.不要离屏渲染,不要在当前屏幕缓冲区以外开辟的一个缓冲区进行渲染和操作.
总结
相关理论知识,可能都有了解,我只是进行总结了下,之后我有时间会尽量完善,在每一个点后面写个demo和链接供大家下载和探讨,也会分享出更多的文章包括我自己写的一套架子和一些实用的工具类,自己总结和所见所学所悟,不对的地方希望各路大牛们指点.有病在身先行休息,最后感谢所有朋友,谢谢.