Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

作者:news 发表时间:2025-08-22
杰克逊霍尔统一战线成型 各央行掌门将力挺特朗普杯葛的鲍威尔官方通报来了 李振国入选!龙国工程院院士候选名单公布:国家能源集团、国家电投、“两网”多人在列记者时时跟进 与字节跳动合作AI芯片?芯原股份回应 李振国入选!龙国工程院院士候选名单公布:国家能源集团、国家电投、“两网”多人在列后续反转来了 合规领域获国际认可是真的? “车圈拼多多”盈利了,零跑汽车股价翻倍市值千亿又一个里程碑 亚钾国际董事长被逮捕,去年境外落网:所涉事项与公司无关联实测是真的 传统业务“失速”,新兴业务“点火”!金城医药上半年营收、净利双降,公司如何穿越行业周期阵痛?这么做真的好么? La-Z-Boy股价跌13%,Joybird 销售额拖累业绩 印度无视美国施压坚持进口俄罗斯石油 贸易紧张局势持续升温太强大了 鲍威尔的潜在继任者Zervos:美联储从来都不独立 鲍威尔政治上左倾后续反转 液化天然气运输商Flex LNG重申财年展望反转来了 车价降、股价升! 李斌:继续保持高价很难参与市场竞争实垂了 A股独董观察:鹏鼎控股、欣旺达、北鼎股份独董张建军2024年报酬合计56.4万元 兼任深圳市会计协会监事长 OpenAI将在新德里开设首个办事处 以扩大印度业务布局是真的? A股独董观察:新集能源独董崔利国报酬13.8万元 另兼任亚太卫星、中核国际、先丰集团独董报酬合计92.23万元科技水平又一个里程碑 鲍威尔杰克逊霍尔“告别演说”前瞻:9月降息能否拍板定案?后续反转来了 美联储政策预期支撑美元兑日元逼近149关口 美联储降息预期降温推动美元坚挺,黄金连续两日承压徘徊在3330美元附近是真的? 上证指数站上3800点 续创近10年新高后续来了 险资猛砸万亿元,散户资金入市潜力大官方已经证实 中兴通讯港股午后持续拉升 现涨超13%创历史新高实测是真的 算力股全线爆发!寒武纪市值站上5000亿,科创50狂飙7%,沪指突破3800点后续来了 A股独董观察:新希望、飞科电器、奥美医疗独董蔡曼莉报酬合计56.4万元 曾任证监会上市公司监管部处长 官方通报来了 港股新消费概念股走强 名创优品绩后涨超20% 股价创今年1月以来新高 OpenAI首席人事官将离职,转投AI普及事业 应邀出席2025年上海合作组织峰会的外国领导人和国际组织负责人名单公布专家已经证实 什么是汽车行业创业者应该有的心态?李斌这样说官方通报 视频教程二:私募备案信息及投资者查询路径后续来了 视频教程二:私募备案信息及投资者查询路径后续会怎么发展 宁波金融监管局同意交通银行宁波余姚金融大厦支行名称变更是真的吗? 高端白酒价格平稳,习酒1988等多款次高端白酒线上价格下跌记者时时跟进 李斌:全新ES8回到了蔚来作为高端品牌合理、合适、舒服的定价区间,是一个“归位”实测是真的 聚焦今晚10点!鲍威尔重磅演讲来袭,三种情景如何搅动美股市场? 互联网金融急速冲高,指南针大涨超10%!百亿金融科技ETF(159851)拉升逾2%续创新高,资金大举加仓是真的? 曹操出行午前涨逾9%创上市新高 机构指Robotaxi业务贡献高成长性官方处理结果 李宁:上半年全渠道专业跑鞋销量突破1400万双秒懂 高端白酒价格平稳,习酒1988等多款次高端白酒线上价格下跌 喜茶正式上线淘宝闪购:全国超4000家门店已全量运营后续来了 沙特超大型项目红海全球集团将启动融资计划 IPO与REITs均在考虑之内 一股东持股3次降价拍卖,枣庄银行整体估值降至20亿官方通报

一、问题

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

相关文章