Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

作者:news 发表时间:2025-08-12
最新!年薪1100万的太古地产CFO将退任!是真的吗? 景林资产二季度持仓曝光 非常看好龙国资产 特斯拉芯片新计划披露 长安汽车董事长朱华荣拜访任正非:感慨任总格局、睿智令人敬佩专家已经证实 华为有望国内首发eSIM手机 苹果旗舰机现感人价果粉很受伤后续来了 通胀阶段性见底,仍需观察后续反转来了 广东一周新增1387例基孔肯雅热本地病例,佛山疫情快速上涨势头初步遏制 最新!年薪1100万的太古地产CFO将退任!后续来了 最新!年薪1100万的太古地产CFO将退任!实垂了 工信部公示首批生物制造标志性产品名单,嘉必优2--岩藻糖基乳糖入选最新进展 秒懂 某证券公司员工违规炒股,被罚4万元!后续反转 某证券公司员工违规炒股,被罚4万元!官方处理结果 西部证券怒告退市房企,超4000万债券纠纷能追回多少?科技水平又一个里程碑 “反对者”鲍曼:敦促美联储9月降息,支持今年降息3次实测是真的 华南城:公司被香港高等法院下令清盘最新进展 配股融资超600亿元!股价暴跌超30%! 泽连斯基和莫迪同意计划于9月在联合国大会期间举行会晤实时报道 富国股票策略主管Chris Harvey离职 4月市场动荡期间曾坚持看涨美股科技水平又一个里程碑 印度央行释放50亿美元防御措施,特朗普关税后卢比接近历史低点反转来了 城发环境今年上半年营收净利润双增长学习了 葛兰这次为什么限购到10w?后续反转来了 泽连斯基和莫迪同意计划于9月在联合国大会期间举行会晤又一个里程碑 美光上调销售额和盈利展望 因关键产品定价改善官方通报来了 富国银行首席股票策略师克里斯・哈维离职后续反转 三架飞机在境外无法收回,山河智能子公司获赔1.64亿元后续反转来了 葛兰这次为什么限购到10w? 后续会怎么发展 古井贡酒将推出“轻度版古20”,陈建斌将现身助力反转来了 特朗普宣布华盛顿特区进入公共安全紧急状态专家已经证实 三架飞机在境外无法收回,山河智能子公司获赔1.64亿元这么做真的好么? 世运电路拟1.25亿元增资新声半导体是真的吗? 特朗普称希望泽连斯基与普京会面 7月铁路货运有所改善,但多项指标为前景蒙上阴影反转来了 热潮难抵!上海沿浦进军工业机器人领域,拟出资1530万元切入这一“高增长赛道”实时报道 以多元布局应对行业周期 万华化学上半年实现净利润61.23亿元 上海国盛(集团)有限公司副总裁、上海建科董事陈为接受纪律审查和监察调查最新进展 Paxos加入众多加密货币公司行列,申请美国信托银行牌照又一个里程碑 前7个月我国汽车产销均同比大幅增长实测是真的 上海国盛(集团)有限公司副总裁、上海建科董事陈为接受纪律审查和监察调查后续来了 福特新款平价车型起售价约为3万美元后续反转来了 Paxos加入众多加密货币公司行列,申请美国信托银行牌照最新进展 好时和亿滋国际股价下跌 天气担忧导致可可期货上涨后续会怎么发展 热潮难抵!上海沿浦进军工业机器人领域,拟出资1530万元切入这一“高增长赛道”是真的吗?

一、问题

Unity引擎里对渲染后期处理效果很多,如Bloom、运动模糊、景深等效果。实现过程是在作用的摄像机上加脚本并实现OnRenderImage方法,Graphics.Blit(source, destination, material);使用材质material的shader处理帧缓存的数据,再拷贝回屏幕帧缓存。

使用ImageEffect之后,发现在某些机型上(华为mate7、三星N7100),运行效率极低,明显卡顿。UnityProfiler查看真机渲染情况

Unity ImageEffect 效率分析

二、调查分析

Unity文档并没有相关的详细介绍,实现的细节也不得而知。论坛里Camera.AAResolve解释为与抗锯齿有关系,关闭全屏抗锯齿之后测试,确实不会卡顿了。

Unity ImageEffect 效率分析

目前主流移动GPU由三家公司生产,英国Imagination公司的SGX系列,美国高通公司的Adreno系列,以及著名显卡芯片商美国NVIDIA公司的移动GeForce系列。Arm的mali作为非主流,但在市场上有不小的份额,华为Mate7、三星N7100的GPU正是mali系列。

使用Mali Graphics Debugger查看渲染如图:

Unity ImageEffect 效率分析

在前2个drawcall里都调用了glReadPixels接口

Unity ImageEffect 效率分析

在glReadPixels的最后个参数不为空,则表示数据从显存传输到系统内存,从CPU到GPU的逆向传输,这是非常缓慢的过程,并且是阻塞模式。

看看其它机型渲染情况,下面是高通的gpu,使用adrenoprofiler查看。

Unity ImageEffect 效率分析

它并没有调用glReadPixels,而是使用了glBindFramebuffer。FBO(Frame buffer object)在使用前需要绑定,voidglBindFramebuffer(GLenumtarget,GLuintid);第一个参数是指定绑定操作,读、写或可读可写。第二个参数指定绑定的对象,如果是0,则是默认的帧缓存对象。

这是使用了改变渲染目标缓存的方法。

由此可知不同硬件上处理的方式不一样,具体是因为Unity内部实现的原因或是硬件支持不够。查看opengl版本的版本历史和发展

Unity ImageEffect 效率分析

最大变化的版本是OPENGL3.0。其中正式把帧缓冲对象(framebufferobject)划入core profile;帧缓冲对象之间可以互相拷贝像素到持有的不同的render target,是性能上的提升。

在FBO中使用多重采样抗锯齿,在3.0版本才加入的特性,若渲染接口不支持,则用了比较低级的API来完成获取屏幕缓存数据,导致了卡顿。

我们项目使用的是OPENGL2.0,而mali系列并没有很好的支持OPENGL2.0的接口。

用OPENGL3.0导出apk运行在华为mate7(mali系列)上,是没问题的。

Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

同样使用了改变渲染目标缓存的方法,因为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);

运行结果:

Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

相关文章