这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战。
在性能优化中一个最具参考价值的属性是FPS:Frams Per Second
,其实就是屏幕刷新率,苹果的iPhone推荐的刷新率是60Hz,也就是说GPU每秒钟刷新屏幕60次,每刷新一次就是一帧frame,FPS也就是每秒钟刷新多少帧画面。静止不变的页面FPS为0,这个值是没有参考意义的,只有当页面在执行动画或者滑动的时候,FPS值才具有参考价值,FPS值的大小体现了页面的流畅程度高低,当低于45的时候卡顿会比较明显。
图层混合
每一个layer
是一个纹理,所有的纹理都以某种方式堆叠在彼此的顶部,对于屏幕上的每一个像素,GPU需要算出怎么混合这些纹理来得到像素RGB的值。
当Sa=0.5时,RGB值为(0.5,0,0),可以看出,当两个不是完全透明的CALayer覆盖在一起时,GPU大量做这种符合操作,随着这种操作的越多,GPU越忙碌,性能肯定会收到影响。
公式: R = S + D * (1 - Sa)
结果的颜色是源色彩(顶部纹理)+目标颜色(低一层的纹理)*(1-源颜色的透明度)。当Sa = 1时,R = S,GPU将不会做任何合成,而是简单从这个层拷贝,不需要考虑它下方的的任何东西(因为都被它遮挡住了),这节省了GPU相当大的工作量。
入门级
- 用ARC管理内存
- 在正确的地方使用reusedIdentifier
- 尽量把views设置为透明
- 避免过于庞大的XIB
- 不要阻塞主线程
- 在ImageViews中调整图片大小。如果要在UIImageView中显示一个来自于bundle的图片,你应保证图片的大小和UIImageView的大小相同,在运行时缩放图片是很耗资源的,特别是UIImageView嵌套在UIScrollView中的情况下。如果图片是从远端服务加载的你不能控制图片大小,比如在下载前调整到合适大小的话,你可以在下载完成后,最好用 background thread,缩放一次,然后在UIImageView中使用缩放后的图片。
- 选择正确的Collection
- Arrays:有序的一组值,使用index来lookup很快,使用value lookup很慢,插入/删除很慢。
- Dictionary:存储键值对,用键来查找比较快
- Sets:无序的一组值,用值来查找很快,插入/删除很快
- 打开gzip压缩。app可能大量依赖服务器资源,问题是我们的目标是移动设备,因此你不能指望网络状态有多好,减小文档的一个方式就是子啊服务端和你的app中打开gzip。这对于文字这种能有更高压缩率的数据来说会有更显著的作用。 iOS已经在NSURLConnection中默认支持了gzip压缩,当然AFNetworking这些基于它的框架亦然。