解决Unity引擎后期渲染的性能问题(转)
2017-11-30 16:18
1951 查看
一问题
Unity引擎里对渲染后期处理效果很多,如Bloom、运动模糊、景深等效果。实现过程是在作用的摄像机上加脚本并实现OnRenderImage方法,Graphics.Blit(source, destination, material);使用材质material的shader处理帧缓存的数据,再拷贝回屏幕帧缓存。
使用ImageEffect之后,发现在某些机型上(华为mate7、三星N7100),运行效率极低,明显卡顿。UnityProfiler查看真机渲染情况
二调查分析Unity文档并没有相关的详细介绍,实现的细节也不得而知。论坛里Camera.AAResolve解释为与抗锯齿有关系,关闭全屏抗锯齿之后测试,确实不会卡顿了。
目前主流移动
GPU 由三家公司生产,英国 Imagination 公司的 SGX 系列,美国高通公司的 Adreno 系列,以及著名显卡芯片商美国 NVIDIA 公司的移动 GeForce 系列。Arm的mali作为非主流,但在市场上有不小的份额,华为Mate7、三星N7100的GPU正是mali系列。
使用Mali Graphics Debugger查看渲染如图:
在前2个drawcall里都调用了glReadPixels接口
在glReadPixels的最后个参数不为空,则表示数据从显存传输到系统内存,从CPU到GPU的逆向传输,这是非常缓慢的过程,并且是阻塞模式。
看看其它机型渲染情况,下面是高通的gpu,使用adrenoprofiler查看。
它并没有调用glReadPixels,而是使用了glBindFramebuffer。FBO(Frame
buffer object)在使用前需要绑定,void glBindFramebuffer(GLenum target, GLuint id);第一个参数是指定绑定操作,读、写或可读可写。第二个参数指定绑定的对象,如果是0,则是默认的帧缓存对象。
这是使用了改变渲染目标缓存的方法。
由此可知不同硬件上处理的方式不一样,具体是因为Unity内部实现的原因或是硬件支持不够。查看opengl版本的版本历史和发展最大变化的版本是OPENGL3.0。其中正式把帧缓冲对象(framebuffer
object)划入core profile;帧缓冲对象之间可以互相拷贝像素到持有的不同的render target,是性能上的提升。
在FBO中使用多重采样抗锯齿,在3.0版本才加入的特性,若渲染接口不支持,则用了比较低级的API来完成获取屏幕缓存数据,导致了卡顿。
我们项目使用的是OPENGL2.0,而mali系列并没有很好的支持OPENGL2.0的接口。
用OPENGL3.0导出apk运行在华为mate7(mali系列)上,是没问题的。
同样使用了改变渲染目标缓存的方法,因为3.0版本的FBO支持多采样。
三问题结论OPENGL2.0,ImageEffect屏幕后期处理时,改变渲染目标缓存,绑定FBO,若不在ProjectSettings里设置全屏抗锯齿是没问题的。若设置了全屏抗锯齿,不同硬件对不同版本OPENGL的支持不定。
四解决方案
1、关闭抗锯齿。
2、提升OPENGL版本到3.0。
3、不使用unity的OnRenderImage方法,直接使用渲染到纹理的方法。
第一种方案效果有损失,不可取;第二种可行,但版本的提升可能会有些不可预估的问题,3.0版本也弃用了很多的特性;第三种最可行,渲染到纹理的方法在绝多数机型都支持。实现方法如下:
1、摄像机上挂接一个脚本
2、Start方法,temp = RenderTexture.GetTemporary获取渲染纹理
3、Update方法,设置Camera.targetTexture = temp;
4、OnPostRender方法,设置Camera.targetTexture =null;Graphics.Blit(temp, null, material);
运行结果:
此证明我的mate7还是可以的,哈哈。
Unity引擎里对渲染后期处理效果很多,如Bloom、运动模糊、景深等效果。实现过程是在作用的摄像机上加脚本并实现OnRenderImage方法,Graphics.Blit(source, destination, material);使用材质material的shader处理帧缓存的数据,再拷贝回屏幕帧缓存。
使用ImageEffect之后,发现在某些机型上(华为mate7、三星N7100),运行效率极低,明显卡顿。UnityProfiler查看真机渲染情况
二调查分析Unity文档并没有相关的详细介绍,实现的细节也不得而知。论坛里Camera.AAResolve解释为与抗锯齿有关系,关闭全屏抗锯齿之后测试,确实不会卡顿了。
目前主流移动
GPU 由三家公司生产,英国 Imagination 公司的 SGX 系列,美国高通公司的 Adreno 系列,以及著名显卡芯片商美国 NVIDIA 公司的移动 GeForce 系列。Arm的mali作为非主流,但在市场上有不小的份额,华为Mate7、三星N7100的GPU正是mali系列。
使用Mali Graphics Debugger查看渲染如图:
在前2个drawcall里都调用了glReadPixels接口
在glReadPixels的最后个参数不为空,则表示数据从显存传输到系统内存,从CPU到GPU的逆向传输,这是非常缓慢的过程,并且是阻塞模式。
看看其它机型渲染情况,下面是高通的gpu,使用adrenoprofiler查看。
它并没有调用glReadPixels,而是使用了glBindFramebuffer。FBO(Frame
buffer object)在使用前需要绑定,void glBindFramebuffer(GLenum target, GLuint id);第一个参数是指定绑定操作,读、写或可读可写。第二个参数指定绑定的对象,如果是0,则是默认的帧缓存对象。
这是使用了改变渲染目标缓存的方法。
由此可知不同硬件上处理的方式不一样,具体是因为Unity内部实现的原因或是硬件支持不够。查看opengl版本的版本历史和发展最大变化的版本是OPENGL3.0。其中正式把帧缓冲对象(framebuffer
object)划入core profile;帧缓冲对象之间可以互相拷贝像素到持有的不同的render target,是性能上的提升。
在FBO中使用多重采样抗锯齿,在3.0版本才加入的特性,若渲染接口不支持,则用了比较低级的API来完成获取屏幕缓存数据,导致了卡顿。
我们项目使用的是OPENGL2.0,而mali系列并没有很好的支持OPENGL2.0的接口。
用OPENGL3.0导出apk运行在华为mate7(mali系列)上,是没问题的。
同样使用了改变渲染目标缓存的方法,因为3.0版本的FBO支持多采样。
三问题结论OPENGL2.0,ImageEffect屏幕后期处理时,改变渲染目标缓存,绑定FBO,若不在ProjectSettings里设置全屏抗锯齿是没问题的。若设置了全屏抗锯齿,不同硬件对不同版本OPENGL的支持不定。
四解决方案
1、关闭抗锯齿。
2、提升OPENGL版本到3.0。
3、不使用unity的OnRenderImage方法,直接使用渲染到纹理的方法。
第一种方案效果有损失,不可取;第二种可行,但版本的提升可能会有些不可预估的问题,3.0版本也弃用了很多的特性;第三种最可行,渲染到纹理的方法在绝多数机型都支持。实现方法如下:
1、摄像机上挂接一个脚本
2、Start方法,temp = RenderTexture.GetTemporary获取渲染纹理
3、Update方法,设置Camera.targetTexture = temp;
4、OnPostRender方法,设置Camera.targetTexture =null;Graphics.Blit(temp, null, material);
运行结果:
此证明我的mate7还是可以的,哈哈。
相关文章推荐
- 利用预渲染解决优化性能问题IOS
- Unity游戏引擎游戏开发时遇到内存泄漏问题怎么办? 自研发的Unity游戏老是卡顿、闪退,有什么办法解决吗?
- 解决Unity Vertex Shader 渲染丢失的问题
- unity中3D text渲染遮挡问题解决
- 【小松教你手游开发】【unity实用技能】控制renderQueue解决NGUI与Unity3D物体渲染顺序问题
- [Unity]关于iOS申请因为Advertising Identifier问题被拒绝的解决方法
- Unity 中关于中文乱码以及压缩解压遇到的问题解决方法
- benchmark pm2的cluster模式发布web app的性能与相关问题解决方法
- Unity中关于多种安卓插件冲突问题的解决方法
- Unity UGUI —— 鼠标穿透UI问题(Unity官方的解决方法)
- mysql性能优化问题定位-待解决
- Redis 常见的性能问题和解决方法
- 如何解决秒杀的性能问题和超卖的讨论
- Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法 .
- mybatis批量插入oracle大量数据记录性能问题解决
- Win7或者Win8 安装 Visual Studio 2013 Tools for Unity 遇到2502或者2503问题的解决方法
- wxWidgets中OpenGL渲染环境的配置,主要解决不能显示物体阴影问题
- ArcGIS Server或IMS的AppLockMgr导致Desktop性能问题的解决办法(ESRI官方版)
- ListView 显示网络图片,问题解决及性能优化
- 解决Ionic的ion-slide-box 2条数据渲染问题