一提离屏渲染,我们直观上的感觉是会对性能有影响。因为为了满足 60fps 的刷新频率,GPU 的操作都是高度流水线化的。本来所有的计算工作都在有条不紊地正在向 frame buffer 输出,这时候突然又有一些特殊的效果触发了离屏渲染,需要切换上下文,把数据输出到另一块内存,这时候流水线中很多中间产物只能被丢弃,这种频繁的上下文切换对 GPU 的渲染性能有非常大的影响。
如何防止非必要离屏渲染?- 对于一些圆角可以创建四个背景颜色弧形的 layer 盖住四个角,从视觉上制造圆角的效果
- 对于 view 的圆形边框,如果没有 backgroundColor,可以放心使用 cornerRadius 来做
- 对于所有的阴影,使用 shadowPath 来规避离屏渲染
- 对于特殊形状的 view,使用 layer mask 并打开 shouldRasterize 来对渲染结果进行缓存
使用CALayer的cornerRadius并设置 cliptobounds 以后会触发离屏渲染(offscreen rendering)。滚动时每秒需要在 60 帧上执行裁剪操作,即使内容没有发生任何变化。GPU 也必须在每帧之间切换上下文,合成整个帧和裁剪。这些对性能的消耗直接影响到 Render Server 这个独立渲染进程,造成掉帧。为了优化渲染性能,我们可以选择一些其他的实现圆角的方案。下边是圆角的具体实现需要考虑的条件。
圆角的具体实现需要考虑的条件
- 圆角下(movement underneath the corner)是否有滑动。
- 是否有穿过圆角滑动(movement through the corner)。
- 四个圆角是否处于同一个 layer 上,有没有与其他 子 layer 相交。
圆角的具体实现方案
如何根据对应的条件选取圆角的实现方案
上边提到了圆角的优化要考虑的条件以及不同的圆角实现方案,下边这个流程图就是把条件和方案对应起来,给出了圆角的最佳实现方案。