目标:
1.要达到什么样的流畅度(FPS达到60为优秀) FPS:1秒渲染多少帧
2.应用内存降到一个具体数字
方案: 可以通过两个的纬度考虑性能优化
CPU与GPU资源消耗原因以及解决办法
CPU:加载对图文布局
加载资源,对象创建,对象调整,对象销毁,图片解码,图片绘制,文本计算,文本渲染,布局计算,布局Autolayout
GPU:文视图
纹理渲染,视图混合,图形形成(三角,遮罩)
GPU的渲染性能比CPU高效很多,同时对系统的负载和消耗更低一些,所以,我们应该尽量让CPU负责主线程UI调动,图形显示相关工作交给GPU
软件性能优化:启动内存管理:4避免,3图片,NSAutoreleasepool/coreText ,网络优化
1.启动优化
2.内存管理
使用ARC,避免循环引用,CoreAnimation对象手动释放
3.避免主线程阻塞
永远不要使主线程承担过多
阻碍主进程的情形:1.网络同步请求2.I/0操作:读写外部资源3.大量运算4.解压缩
4.避免过于庞大的XIB
5.避免使用透明视图
透明对性能要求较高
6.避免离屏渲染
离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。离屏渲染意味着你App的部分区域每一帧渲染了两次。所以会造成一定的性能损失。
7.图片的处理
通常会用imageNamed:来加载mainbundle中的图片,此函数会缓存加载的image。因此,对于那些被重用的图片,这个API很高效。但是对于那些使用很少的图片,用这个就很耗内存。
使用一次的应用图片时使用initWithContentsOfFile:函数,加载多次使用的图片时就使用imageNamed:函数。
8.在Imageview中调整图片大小:
1. 如果要在UIImageview中显示本地资源图片,尽量保持大小一致,运行中缩放图片很消耗资源
2.如果图片是从远端服务加载的不能控制图片大小,最好缩放一次,然后在UIImageView中使用缩放后的图片
9.使用缓存/SDWebImage与Cache
因为数据具有时效的,所以对于时效性要求不高的数据完全可以使用缓存来保证快速显示。例如URL对应的图片缓存(SDWebImage),通过数据库活core Data来保存不需要变动的数据,UIWeb的缓存等都属于这种
10.NSAutoreleasepool
在临时创建大量对象时,使用NSAutoreleasepool,例如,一个循环用于创建包含多个对象的数组,在循环体内,即可使用@autoreleasepool包裹创建代码。使用系统的@autoreleasepool会有延迟,内存不会马上释放。
11.CoreText
对于排版复杂的文字或者图文混排,使用CoreText技术
12.减少Layer与视图层级
减少视图或者layer的层级数量,在有多个层级时,可以将多图合并成一张图,再渲染显示。
13.重用一些高消耗的对象
如NSDateFormatter、NSCalender等。解决方法:可以将其作为property、甚至是静态变量作为单例在APP中使用。并且,NSDateFormatter的 setDateFormate也是非常消耗资源的一个操作。网络传输过来的数据,往往是json或xml字符串。直接将这些字符串转换成我们需要的数据结构(自定义类或者NSDictionary),避免后续使用的时候还要做数据结构转换产生不必要的消耗。
14.关于后台运行
进入后台后,即尽量减少内存占用、释放所有的共享资源(如Calender或address book),因为iOS会kill后台中内存消耗最多的或者进入后台还占用共享资源的进程。
15.网络性能
网络性能优化涉及到DNS解析,路由算法,以及服务器端性能
网友评论