iOS 离屏渲染

文章目录
  1. 1. iOS 渲染

什么是离屏渲染?
他对性能有什么影响?
如何避免离屏渲染?

iOS 渲染

如果想要了解离屏渲染,应该先知道iOS渲染框架是什么样的。

core animation pipeline
让屏幕页面流畅应该保证页面刷新率为 60 帧/秒,1 帧的时间大概就是 16.67 ms了。
iOS 的渲染框架: Core Animation

  • 组合屏幕上的内容,追踪视图结构和内容的变化。
  • 流程图中 Commit Transaction 前面的红框代表触发视图内容变化的事件,比如点击按钮
  • 之后Core Animation 框架会捕获到屏幕内容的变化并提交给 Render Server(渲染服务器)
  • Render Server 里另外一个版本的 Core Animation 框架负责解码并绘制内容。
  • CPU 解码完成后将数据交给 GPU
  • GPU 渲染完成后显示

离屏渲染是为了 缓存的
离屏渲染空间只有屏幕的 2.5倍
100ms 以后如果缓存没有使用就会被释放掉

圆角图片

由于GPU的浮点运算能力比CPU强,CPU渲染的效率可能不如离屏渲染。但如果仅仅是实现一个简单的效果,直接使用 CPU 渲染的效率又可能比离屏渲染好,毕竟普通的离屏渲染要涉及到缓冲区创建和上下文切换等耗时操作。对一些简单的绘制过程来说,这个过程有可能用CoreGraphics,全部用CPU来完成反而会比GPU做得更好。

一个常见的 CPU 渲染的例子是:重写 drawRect 方法,并且使用任何 Core Graphics 的技术进行了绘制操作,就涉及到了 CPU 渲染。整个渲染过程由 CPU 在 App 内同步地完成,渲染得到的bitmap最后再交由GPU用于显示。总之,具体使用 CPU 渲染还是使用 GPU 离屏渲染更多的时候需要进行性能上的具体比较才可以。

一个常见的性能优化的例子就是如何给 UIView/UIImageView 加圆角。

如下是三种加圆角的方式:

设置 cornerRadius
UIBezierPath
Core Graphics(为 UIView 加圆角)与直接截取图片(为 UIImageView 加圆角)
如下是这三种方法的比较:

Advanced Graphics and Animations for iOS Apps(WWDC14 419)