1、CPU 和GPU
1.在屏幕成像过程中,CPU和GPU非常重要
CPU:
对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制
GPU:
纹理的渲染
CPU(计算)–> GPU(渲染)–>帧缓存–>视频控制器(读取)–>屏幕(显示)
2.在iOS中是双缓冲机制,有前帧缓存、后帧缓存
2、卡顿的原因
1.尽可能减少CPU、 GPU消耗的资源
2.按照60FPS来算,每隔16ms就有一次Vsync信号,刷新屏幕
3、卡顿优化–CPU
1.尽量用轻量级的对象,比如用不掉事件处理的地方,可以考虑用CALayer取代UIView
2.不要频繁地调用UIView的相关属性,比如frame\bounds\transform等属性,尽量减少不必要的修改
3.尽量提前计算好布局,在有需要的时候一次性调整对应的属性
4.Autolayout会比直接设置frame消耗更多的CPU资源
5.图片的size最好刚好跟UIImageView的size保持一致
6.控制一下线程的最大并发数量
7.尽量把耗时操作放到子线程,例如文本处理(尺寸计算、绘制),图片处理(解码、绘制)
4、卡顿优化–GPU
1.尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
2.GPU能处理的最大纹理尺寸是4096*4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
3.尽量减少视图数量和层次
4.减少透明的视图(alpha<1),不透明的设置opaque为YES
5.尽量避免出现离屏渲染
5、离屏渲染
1.在OpenGL中,GPU有2中渲染方式
(1)On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作
(2)Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
2.离屏渲染耗性能的原因
(1)需要创建新的缓冲区
(2)离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境切换回来
3.哪些操作会触发离屏渲染?
(1)光栅化,layer.shouldRasterize = YES
(2)遮罩,layer.mask
(3)圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0,考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片
(4)阴影,layer.shadowXXX
如果设置了layer.shadowPath就不会产生离屏渲染
卡顿检测框架:https://github.com/UIControl/LXDAppFluecyMonitor
6、耗电优化
耗电主要来源:
1.CPU
2.网络
3.定位
4.图像
1、尽可能降低CPU\GPU功耗
2、少用定时器
3、优化I/O操作
(a)尽量不要频繁写入小数据,最好批量一次性写入
(b)读写大量重要数据时,考虑用dispatch_io,其提供了基于GCD的异步操作文件I/O的API.用dispatch_io系统会优化磁盘访问。
(c)数据量比较大的,建议使用数据库(SQLite、CoreData)
4、网络优化
(a)减少、压缩网络数据
(b)如果多次请求的结果是相同的,尽量使用缓存
(c)使用断点续传,否则网络不稳定时可能多次传输相同的内容
(d)网络不可用时,不要尝试执行网络请求
(e)让用户可以取消长时间运行或者速度很慢的网络操作,设置合适的超时时间
(f)批量传输,比如,下载视频流(广告、电子邮件)时,不要传输很小的数据包,直接下载整个文件或者一大块地下载。
定位优化
1、如果只是需要快速确定用户位置,最好用CLLocationManager的requestLocation方法。定位完成后,会自动让定位硬件断电。
2、如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
3、尽量降低定位精度,比如尽量不要使用精度最高的kCLLocationAccuracyBest