iOS 性能优化_GPU 消耗优化

GPU 资源消耗原因和解决方案

相对 CPU 来说,GPU 能做的事情比较单一:接收提交的纹理(Texture)和顶点描述(三角形)、应用变换(transform)、混合并渲染,然后输出到屏幕上。通常你能看到的内容,也就是纹理(图片)和形状(三角模拟的矢量图形)两类。

  1. 纹理的渲染
    所有的 Bitmap,包括图片、文本、栅格化的内容,最终都要由内存提交到显存,绑定为 GPU Texture。不论是提交到显存的过程,还是 GPU 调整和渲染 Texture 的过程,都要消耗不少的 GPU 资源。当在较短的时间内显示大量图片,比如 TableView 存在非常多的图片并快速滑动的时候,CPU 占用率很低,但是 GPU 占用率非常高,界面仍然会掉帧。避免这种情况的方法只能是尽量减少在短时间内大量图片的显示,比如尽量合并成一张图片来显示。

  2. 视图的混合
    当多个视图(或者说 CALayer)重叠在一起显示的时候, GPU 首先会将它们混合在一起。如果视图结构过于复杂,混合的过程也会消耗很多的 GPU 资源。为了减轻这种情况的 GPU 消耗,应当尽量减少视图数量和层次,并在不透明的视图中标明 opaque 以避免无用的 Alpha 通道合成,当然,也可以用上面的方法,把多个视图预先渲染为一张图片来显示。

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

你可能感兴趣的:(iOS 性能优化_GPU 消耗优化)