前言
性能优化在一些小公司开发都不被重视,只要功能能用就OK了,一旦用户量大或者数据量大就承受不了.在大厂非常重视性能优化,因此我们开发时,注意代码规范和性能的问题.
界面卡顿原因
卡顿解析图.jpg
从图中可以看到,页面显示需要CPU和GPU共同参与才能显示,其中VSync是垂直渲染.CUP负责视图的创建、布局计算、图片解码.。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。当CPU和GPU没有将处理结果提交,就会导致页面一直停留在原来的页面,等待再次显示.
优化的策略
1.CPU任务的优化
a.布局计算
尽量简化布局,提前计算好布局,减少不必要的界面更新
b.对象创建
使用轻量级对象,例如:采用纯代码构建页面,用xib会进行反序列化,导致内存占用
对于列表优化采用重用机制进行渲染
列表的性能优化
c.Autolayout:
平时业务不复杂可以使用autolayout,但是业务复杂时需要采用手动布局,控制好刷新频率
d.文本计算
优化计算算法,提前计算布局
f.文本渲染
静态文本我们应该尽量减少它所在视图的布局修
改
g.图像的绘制
尽量减少图片的绘制,业务需要时,将图片绘制放到后台程进行处理,最终设置到layer的content中
- (void)display {
dispatch_async(backgroundQueue, ^{
CGContextRef ctx = CGBitmapContextCreate(...);
// draw in context...
CGImageRef img = CGBitmapContextCreateImage(ctx);
CFRelease(ctx);
dispatch_async(mainQueue, ^{
layer.contents = img;
});
});
}
f.图片的解码
图片解码可以放到后台进行解码,也可以通过RunLoop的空闲状态中进行解码
2.GPU任务的优化
接收提交的纹理(Texture)和顶点描述
(三角形),应用变换(transform)、混合并渲染,然后输出到屏幕上。
a.视图优化
减少不必要的透明视图,减少大图的加载,将多张图片合成一张
b.离屏渲染
是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
离屏渲染导致性能下降原因:
阴影,圆角,图层蒙板,开启光栅化
例如:CALayer的属性设置为shouldRasterize,就开启了光栅化,光栅
化也会带来一定的性能损耗,可以用 CoreGraphics 将图片处理成
圆角来避免