离屏渲染
当前屏幕渲染:指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
离屏渲染:指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
当我们指定了UI的某些属性,标记为它在位域合成之前不能用于当前屏幕显示的时候就会触发离屏渲染,而离屏渲染的概念起源于GPU层面,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
何时会触发?
- 圆角(当和maskToBounds一起使用时)
- 图层蒙版
- 阴影
- 光栅化
- clipsToBounds
为何要避免?
GPU层面上触发多通道渲染管线,产生了额外开销,所以需要避免。
增加GPU工作量有可能超出16.7ms,可能会导致UI的卡顿,掉帧。
Facebook开源的异步绘制框架AsyncDisplayKit
- 创建新的渲染缓冲区
- 上下文切换
使UITableVIew滚动更流畅的方案或思路都有些哪些?
CPU和GPU两方面
对于CPU: 在子线程上面进行一些对象的创建调整销毁预排版绘制
GPU上:
当我们需要圆角效果时,可以使用一张中间透明图片蒙上去
使用ShadowPath指定layer阴影效果路径
使用异步进行layer渲染(Facebook开源的异步绘制框架AsyncDisplayKit)
设置layer的opaque值为YES,减少复杂图层合成
尽量使用不包含透明(alpha)通道的图片资源
尽量设置layer的大小值为整形值
直接让美工把图片切成圆角进行显示,这是效率最高的一种方案
很多情况下用户上传图片进行显示,可以让服务端处理圆角
使用代码手动生成圆角Image设置到要显示的View上,利用UIBezierPath(CoreGraphics框架)画出来圆角图片