Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

作者:news 发表时间:2025-08-04
超级赛道迎重大利好!融资客加仓+筹码集中,5只概念股来了后续反转 超级赛道迎重大利好!融资客加仓+筹码集中,5只概念股来了 遭特朗普指责之后 印度据悉尚未停止从俄罗斯购买石油 “稳增长”与“防风险”并重 央行明确下半年七方面工作重点 首富的算盘:锦波生物能否为钟睒睒再造神迹? 破解“不可成药”:一体化平台赋能创新分子胶药物发现 | Bilingual后续来了 传奥克斯电气最早9月登陆港交所,交易规模约6至8亿美元,已完成香港上市第二轮NDR专家已经证实 安费诺(APH.US)将以105亿美元价格收购康普旗下宽带连接业务 央行:继续实施好适度宽松的货币政策 突出服务实体经济重点方向 超级赛道迎重大利好!融资客加仓+筹码集中,5只概念股来了官方通报 余承东:尊界S800上市67天大定超1万台官方通报来了 开盘大涨超11%,半导体领域重大资产重组是真的? AI预测医药行业未来5年最紧缺的人才类型这么做真的好么? 山东前首富,又要IPO了 一览六家加密机构的“中场答卷”:Strategy豪赚百亿,Coinbase靠投资救场最新报道 机器人投资:看热闹的是流量,出钱的是VC,赔钱的是谁?实测是真的 山东前首富,又要IPO了记者时时跟进 巨星传奇再涨近6% 公司启动百位潮流艺术家合作计划 近期与宇树科技达成战略合作官方处理结果 固态电池概念股震荡走高,晶华新材逼近涨停 啤酒嘉年华 点燃夜经济!2025厦门啤酒消费季思明主场暨思明区仲夏消费季启幕 新股广东建科网上发行的中签率为0.0236%秒懂 军工股涨势扩大 北方长龙等多股创历史新高是真的? 电力设备系列:海外AIDC需求强劲,HVDC逐步成为共识秒懂 药明康德:7月份累计回购A股股份5614518股是真的吗? 黑芝麻“改嫁”广西国资 药明康德:7月份累计回购A股股份5614518股 远东股份:累计回购公司股份2225.39万股 工大高科副董事长张汉龙拟减持不超15万股秒懂 恒烁股份:股东减持公司股份计划完成,累计减持1376777股又一个里程碑 柳药集团:尚未回购公司股份官方处理结果 工大高科副董事长张汉龙拟减持不超15万股 美格智能:累计回购公司股份568500股学习了 海南高速:截至2025年7月31日公司股东总户数为74072户 远东股份:累计回购公司股份2225.39万股

一、问题

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 效率分析

相关文章