离屏渲染学习笔记
来源:互联网 发布:windows phone10更新 编辑:程序博客网 时间:2024/05/18 02:41
注:原文 http://foggry.com/blog/2015/05/06/chi-ping-xuan-ran-xue-xi-bi-ji/
一、概念理解
OpenGL中,GPU屏幕渲染有以下两种方式:
- On-Screen Rendering
意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。
- Off-Screen Rendering
意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
二、离屏渲染的是是非非
相比于当前屏幕渲染,离屏渲染的代价是很高的,主要体现在两个方面:
- 创建新缓冲区
要想进行离屏渲染,首先要创建一个新的缓冲区。
- 上下文切换
离屏渲染的整个过程,需要多次切换上下文环境:先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上有需要将上下文环境从离屏切换到当前屏幕。而上下文环境的切换是要付出很大代价的。
三、离屏渲染触发方式
设置了以下属性时,都会触发离屏绘制:
- shouldRasterize(光栅化)
- masks(遮罩)
- shadows(阴影)
- edge antialiasing(抗锯齿)
- group opacity(不透明)
需要注意的是,如果shouldRasterize被设置成YES,在触发离屏绘制的同时,会将光栅化后的内容缓存起来,如果对应的layer及其sublayers没有发生改变,在下一帧的时候可以直接复用。这将在很大程度上提升渲染性能。
而其它属性如果是开启的,就不会有缓存,离屏绘制会在每一帧都发生。
四、另一种特殊的“离屏渲染”
按照之前的说法,如果将不在GPU的当前屏幕缓冲区中进行的渲染都称为离屏渲染,那么就还有另一种特殊的“离屏渲染”方式: CPU渲染
。
如果我们重写了drawRect方法,并且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染。整个渲染过程由CPU在App内 同步地
完成,渲染得到的bitmap最后再交由GPU用于显示。
五、Instruments
Instruments的Core Animation工具中有几个和离屏渲染相关的检查选项:
- Color Offscreen-Rendered Yellow
开启后会把那些需要离屏渲染的图层高亮成黄色,这就意味着黄色图层可能存在性能问题。
- Color Hits Green and Misses Red
如果shouldRasterize被设置成YES,对应的渲染结果会被缓存,如果图层是绿色,就表示这些缓存被复用;如果是红色就表示缓存会被重复创建,这就表示该处存在性能问题了。
六、如何抉择
现在摆在我们面前得有三个选择:当前屏幕渲染、离屏渲染、CPU渲染,该用哪个呢?这需要根据具体的使用场景来决定。
- 尽量使用当前屏幕渲染
鉴于离屏渲染、CPU渲染可能带来的性能问题,一般情况下,我们要尽量使用当前屏幕渲染。
- 离屏渲染 VS CPU渲染
由于GPU的浮点运算能力比CPU强,CPU渲染的效率可能不如离屏渲染;但如果仅仅是实现一个简单的效果,直接使用CPU渲染的效率又可能比离屏渲染好,毕竟离屏渲染要涉及到缓冲区创建和上下文切换等耗时操作。
总之,具体的选择应该由性能测试结果来决定。
参考文档
Getting Pixels onto the Screen (中文翻译版: 绘制像素到屏幕上 )
Designing for iOS: Graphics & Performance (中文翻译版: iOS图形处理和性能)
a performance minded take on ios design (中文翻译版: iOS离屏绘制的性能和机制分析 )
- 离屏渲染学习笔记
- 离屏渲染学习笔记
- 离屏渲染学习笔记
- 离屏渲染学习笔记
- 【iOS 笔记】离屏渲染
- D3D学习笔记(渲染管道)
- Direct3D学习笔记:渲染管线
- 学习osg渲染内核笔记
- Forward渲染路径学习笔记
- unity 渲染线段 学习笔记
- DirectX 渲染 学习笔记(1)
- 学习笔记:浏览器渲染优化——关键渲染路径
- Direct3D学习笔记二:渲染管线
- flex4 学习笔记-flex项目渲染器
- [学习笔记]浏览器渲染原理
- COCOS学习笔记--Cocos引擎渲染流程
- [Unity3D]Shader学习笔记之渲染流水线
- Spring学习笔记-C6-渲染Web试图
- Apple Pay强势来袭,开发者应做的事情
- kettle删除指定数据
- 流式大数据处理 (实时)的三种框架:Storm,Spark和Samza
- 每天学习十分钟24之工作笔记
- linux(ubuntu)安装jdk
- 离屏渲染学习笔记
- C++常用的智能指针
- 23种设计模式(17):备忘录模式
- getwidth和getmeasuredwidth的区别
- [LeetCode]106 根据中序遍历和后序遍历构建二叉树
- 如何将jpg转换成pdf图片格式
- mac上git管理工具sourcetree使用
- 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别
- 新年开始,让自己回到最初的状态