cpu做哪些工作呢?
对象的创建和销毁,对象属性的调整,布局计算,文本的计算和排版,图片的格式转换和转码,图像的绘制(core graphics);
gpu做哪些工作呢?
纹理渲染
渲染过程?
ios是双缓存机制,有前帧缓存和后帧缓存
屏幕成像原理?
屏幕成像和视频一样,都是一帧一帧的。而当一帧画面绘制完成后,电子枪回复到原位,准备画下一帧前,显示器会发出一个垂直同步信号(vertical synchronization),简称VSync。显示器通常以固定频率(硬件时钟)进行刷新,这个刷新率就是VSync信号产生的频率。
卡顿产出的原因?
ios以每秒60帧的频率渲染,如果垂直同步信号来了,cpu和gpu的工作还没处理完,缓存区里还是上一次的,所以渲染的还是上一帧的数据,这样就产生了卡顿。而本次的只能等待下一次垂直同步信号。
卡顿的解决思路?
就是尽可能的减少cpu和gpu的工作。
卡顿的优化-cpu
1,尽可能的使用轻量级的对象或者数据类型。
比如用int不要用nsnumer,不需要事件处理时用calayer不要用uiview;
2,不要频繁的调整uiview的属性,如frame等;
3,尽可能的提前计算好frame,需要时一次性渲染;
4,autolayout会比设置frame消耗更多资源;
5,图片的size最好和uiimageview保持一致,不要让cpu再去进行缩放计算;
6,控制线程的最大并发数量;
7,尽量的把耗时的操作放到子线程;
比如 [UIImage imageNamed:1.png] 我们完全可以改成去子线程解码,再回主线程渲染;
卡顿的优化-gpu
1,避免在短时间内绘制大量的图片;
2,gpu能处理的最大的纹理尺寸就是4096*4096,一旦超过就会让cpu处理,所以尽量不要超过这个尺寸;
3,尽可能的减少视图的层次和数量;
4,尽量减少透明的视图(alpha小于1),一旦有透明度,就是一个混合运算。不透明的视图就把opaque设置成yes;
5,尽量避免离屏渲染;
opengl中gpu有两种渲染方式,有当前屏幕渲染,还有离屏渲染。离屏渲染要创建新的缓冲区,而且要把新的缓冲区的内容渲染到屏幕上,还要切换上下文。
那些操作会引发离屏渲染呢?
5.1 光栅化
5.2 self.view.layer.mask
5.3 self.view.layer.masksToBounds = YES; 和 self.view.layer.cornerRadius = 1; 同时使用
5.4 self.view.layer.shadowxxxx
卡顿检测
监听runloop的状态切换,把每两次切换的时间记录下来,如果时间太长,就把主线程调用堆栈打印出来。
参考文献:
网友评论