经典面试题30 - 离屏渲染
2018-04-16 本文已影响35人
豆志昂扬
问题
请解释什么是离屏渲染?
解答
离屏渲染是GPU屏幕渲染的一种,一般可以分为三种类型:
- On-Screen Rendering,意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
- Off-Screen Rendering,意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
- CPU中的离屏渲染,如我们重写了drawRect方法,且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染,因为GPU不支持未知的渲染方式。
GPU内置支持的内容包括View的拼接(Compositing)、纹理的渲染(Texture)等。
当前屏幕渲染不需要额外创建新的缓存,也不需要开启新的上下文,相对于离屏渲染性能更好。但是受当前屏幕渲染的局限因素限制(只有自身上下文、屏幕缓存有限等),当前屏幕渲染有些情况下的渲染解决不了的,就使用到离屏渲染。
相比于当前屏幕渲染,离屏渲染的代价是很高的,主要体现在两个方面:
- 创建新缓冲区
- 上下文切换
离屏渲染的整个过程,需要多次切换上下文环境:先是从当前屏幕切换到离屏,等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,而上下文环境的切换是要付出很大代价的。
既然离屏渲染这么耗性能, 为什么有这套机制呢?
因为图层属性的混合体没有预合成之前不能直接在屏幕中绘制,而需要在别的地方做额外的处理预合成。所以就需要屏幕外渲,不论是CPU还是GPU。
由于屏幕渲染很消耗性能,使用不当会造成应用卡顿,从而影响用户体验。
在iOS开发中,设置了以下属性时,就会触发离屏绘制,使用时要特别小心。
- shouldRasterize(光栅化)
- masks(遮罩)
- shadows(阴影)
- edge antialiasing(抗锯齿)
- group opacity(不透明)
- 复杂形状设置等
- 渐变
更多
获取更多内容请关注微信公众号豆志昂扬:
- 直接添加公众号豆志昂扬;
- 微信扫描下图二维码;