Swift学徒

iOS 性能优化之光栅化

《iOS 开发中的离屏渲染问题》一文中提到,离屏渲染通常发生在 GPU 中。一个 tableView 中有大量带圆角的视图,当 tableView 快速滑动时,可以看到 GPU 已经被占满,而 CPU 占用量很少。这时界面仍然能正常滑动,但平均帧数会降到很低。为了避免这种情况,可以尝试开启光栅化(CALayer.shouldRasterize ),但这会把原本 GPU 离屏渲染的操作转嫁到 CPU 上去。

光栅化

《iOS 开发中的离屏渲染问题》中提到的 GPU 离屏渲染是自动触发的,而开启光栅化,是手动启动离屏渲染,并且将离屏渲染的工作交由 CPU 处理。

开启光栅化会将图层渲染为一个屏幕之外的位图(bitmap),然后将这个位图缓存起来。图层有复杂的视觉效果,这样做就会比重绘所有帧划划算的多。但是光栅化原始图像需要时间,而且还会消耗额外的内存。

当我们使用得当,光栅化可以提供很大的性能优势,但是一定要避免用在内容是动态变化的图层上,不然它缓存方面的优势就会丧失,而且会让性能变的更糟。

另外要注意的一点,设置 shouldRasterize 的同时也要设置 rasterizationScale

最优设置

《iOS 性能优化之视图圆角》中提到了几种性能优化的方法,开启光栅化也能起到一定的性能优化作用。

经过测试,对于 tableView 来说,光栅化性能最好的方式是是开启 cell 的 shouldRasterize,并将 rasterizationScale 设置为 UIScreen.main.scale。如果设置cell.layer.rasterizationScale = cell.layer.contentsScale则会出现视图模糊的现象。

1
2
cell.layer.shouldRasterize = true
cell.layer.rasterizationScale = UIScreen.main.scale

若 cell 中有多个需要离屏渲染的子视图,对每个子视图分别开启光栅化并不会优化性能,反而可能造成性能下降。

使用 Instruments 监测性能

Instruments 的 Core Animation 工具里有检测光栅化是否正确使用的选项:Color Hits Green and Misses Red,如果开启了光栅化,渲染结果会被缓存,如果图层是绿色,就表示有渲染缓存可用;如果是红色,就表示无渲染缓存可用,缓存会被重复创建,这就可能导致性能问题。

注意:这个工具只能在真机上调试时使用。


万恶胖为首 wechat
关注公众号(ID:SwiftBetter),进一步探讨交流。