iOS界面流畅度优化的方法论总结

本文是一些关于流畅度优化的知识点总结,主要参考:链接,感谢原作者。

1. CPU和GPU任一阻碍流程,都会造成掉帧现象,出现卡顿;

2. 可复用的页面尽量放缓存池复用;

3. UIView 和 CALayer

View 持有 Layer 用于显示,View 中大部分显示属性实际是从 Layer 映射而来;Layer 的 delegate 在这里是 View,当其属性改变、动画产生时,View 能够得到通知。UIView 和 CALayer 不是线程安全的,并且只能在主线程创建、访问和销毁。对于不需要响应触摸事件的控件,用CALayer会更加轻量。

4. UI对象的创建可以放到后台线程,UI操作必须在主线程。

CALayer对象除外,因为它只能在主线程创建和操作。

5. 在性能敏感的界面里,Storyboard不是一个好选择。

6. 减少对UIView属性的修改和层级调整;

7. 对持有大量对象的容器类可以放到后台线程去销毁。

这里有个小 Tip:把对象捕获到 block 中,然后扔到后台队列去随便发送个消息以避免编译器警告,就可以让对象在后台线程销毁了。

8. 提前在后台线程计算好UI布局,并缓存起来,一次性调整好UI属性;

9. 图像处理、画布创建都可以放到后台线程,只在最后显示时调度到主线程.

10. 不要使用尺寸过大的图片,目前来说,iPhone 4S 以上机型,纹理尺寸上限都是 4096×4096

11. 避免图像融合,不透明的视图显示设置opaque属性为YES,避免alpha通道合成;

12. 避免离屏渲染

CALayer的 border、圆角、阴影、遮罩maskCASharpLayer的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。当一个列表视图中出现大量圆角的 CALayer,并且快速滑动时,可以观察到 GPU 资源已经占满,而 CPU 资源消耗很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。对于只需要圆角的某些场合,也可以用一张已经绘制好的圆角图片覆盖到原本视图上面来模拟相同的视觉效果。最彻底的解决办法,就是把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。

发表评论

电子邮件地址不会被公开。 必填项已用*标注