cpu和gpu优化

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的状态切换,把每两次切换的时间记录下来,如果时间太长,就把主线程调用堆栈打印出来。

KMCGeigerCounter

LXDAppFluecyMonitor


参考文献:

iOS - 渲染原理

iOS性能检测全家桶 - 全部实测

你可能感兴趣的:(cpu和gpu优化)