Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

作者:news 发表时间:2025-08-05
富瑞:英诺赛科成英伟达800V直流电源合作商意义重大 维持“买入”评级又一个里程碑 泸州老窖浙江地区年销售额超25亿官方通报来了 魅视科技:约7059.41万股限售股8月8日解禁记者时时跟进 康桥悦生活与九天城物业达成战略合作秒懂 魅视科技:约7059.41万股限售股8月8日解禁 美克家居:累计回购179万股是真的? 盐湖股份大宗交易成交9.57亿元 宇通客车:7月销售量同比下降4.05% 里昂:首予心动公司“跑赢大市”评级 目标价60港元后续反转来了 八马茶业年入16亿,创始人子女在福建豪门联姻 标普500展望:疲软数据提高美联储降息预期,股市能否反弹?学习了 标普500展望:疲软数据提高美联储降息预期,股市能否反弹? 魅视科技:约7059.41万股限售股8月8日解禁 南京银行:股东南京高科增持751万股 持股增至9%实时报道 可孚医疗:截至2025年7月31日公司股东总户数约1.9万户这么做真的好么? 福日电子涨停,沪股通净买入5913.04万元 加强个人境外收入监管!境外买卖股票收入也要缴税→官方已经证实 宿迁联盛股东方源智合减持60万股后续反转来了 超级数据集体爆冷,黄金王者归来?永赢基金刘庭宇:黄金及黄金股的上行空间值得重视后续反转来了 军工股涨势扩大 北方长龙等多股创历史新高 医药股大幅走低 创新药方向领跌后续反转来了 反内卷下的纯苯行业或将迎来供需格局转变实时报道 达力普控股早盘涨逾3% 预期中期净亏损同比大幅收窄超过70% AI预测医药行业未来5年最紧缺的人才类型 AI预测医药行业未来5年最紧缺的人才类型最新报道 后续来了 赵薇所持千万股权再被冻结 薛洪言:净值化时代需接受“收益非线性增长”,含权理财规模有望持续扩容实垂了 反内卷下的纯苯行业或将迎来供需格局转变反转来了 赵薇所持千万股权再被冻结官方已经证实 开盘大涨超11%,半导体领域重大资产重组后续来了 开盘大涨超11%,半导体领域重大资产重组实垂了 达力普控股早盘涨逾3% 预期中期净亏损同比大幅收窄超过70% 福达合金:公司及控股子公司担保余额、担保总额分别为约12.2亿元、19.69亿元秒懂 福达合金:公司及控股子公司担保余额、担保总额分别为约12.2亿元、19.69亿元最新报道 “龙国制造”将成股市主旋律后续会怎么发展 Mhmarkets迈汇:贵金属行情反弹背后的隐忧太强大了 走进上证180ETF成分股紫金矿业活动成功举办太强大了 OEXN:美对巴西原油加征关税影响与应对实垂了 益佰制药:收到贵州省药监局暂停生产、销售小儿止咳糖浆通知专家已经证实 福达合金:公司及控股子公司担保余额、担保总额分别为约12.2亿元、19.69亿元 “龙国制造”将成股市主旋律 四川金顶:8月5日召开董事会会议 南华仪器签订6297万元并购贷款合同 用于股权收购 银河电子:银河电子集团累计增持公司股份约476万股,增持计划已实施完毕学习了 CWG Markets外汇:委内瑞拉能源开放助力全球供应稳定最新报道 南特科技董秘履历存疑涉及三家公司查无实据,光大证券及内核尽调或形同虚设 PCB龙头广合科技赴港上市,投资人关注与英伟达合作潜力科技水平又一个里程碑 吉利回应智驾团队整合:涉及品牌与方案仍在商讨与细化阶段,将在合适时机对外沟通相关进展最新进展 印度和菲律宾本周在南海举行联合军演?外交部回应官方已经证实 CWG Markets外汇:委内瑞拉能源开放助力全球供应稳定学习了 李大霄:龙国股市或站上新台阶反转来了

一、问题

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

相关文章