Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

作者:news 发表时间:2025-08-16
0815热点追踪:组件涨价,多晶硅继续狂飙?官方通报来了 众望布艺(605003)6月30日股东户数0.46万户,较上期减少5.42% 长江材料(001296)8月8日股东户数1.6万户,较上期减少2.43%后续会怎么发展 2025年锂钴行业研究框架:新能源金属拐点分析(附下载) 韩国半导体7月份出口额增至147.2亿美元 同比大增31.2%但环比略有下滑后续反转 2025年分众传媒研究报告:“碰一碰”业务助力分众广告巨头实现效果广告大转型(附下载)秒懂 太辰光(300570)6月30日股东户数5.03万户,较上期增加10.13%秒懂 贝莱德在信达生物的持股比例于8月12日从5.26%降至4.58%实时报道 【深度】“债务优化”诱惑:金融“黑灰产”的根治难题记者时时跟进 贝莱德在信达生物的持股比例于8月12日从5.26%降至4.58%记者时时跟进 科沃斯:上半年度净利润同比增长60.84% 57家财险公司车均保费均值超2000元,未来车险价格走势如何?秒懂 【券商聚焦】华鑫证券维持五矿资源(01208)“买入”评级 指Las Bambas强劲表现带动业绩改善官方处理结果 收评:港股恒指跌0.37% 科指跌0.97% 科网股走弱 保险股普涨 联想跌近6%后续反转来了 官方通报来了 舒华体育:上半年归母净利润2017.95万元,同比下降47.44% 沪指盘中突破3700点!这些概念爆发→这么做真的好么? 舒华体育:上半年归母净利润2017.95万元,同比下降47.44% 移远通信:上半年归母净利润4.71亿元,同比增长125.03% 【券商聚焦】中邮证券维持百胜龙国(09987)“买入”评级 指餐厅净利率有望持续上行 Bullish 上市首日飙升 84%,加密热潮下 IPO 定价再受考验是真的吗? 中银证券财务总监刘国强年薪为117万,比券商CFO平均薪酬低15万,中银证券董事长周冰该给CFO加薪了记者时时跟进 国电南瑞:参与完成国内外众多大型水电站自动化信息化系统建设官方处理结果 卢伟冰回应小米手机东南亚第一:市场份额不是最关键,高端机和苹果三星还有较大差距实测是真的 【券商聚焦】华鑫证券维持五矿资源(01208)“买入”评级 指Las Bambas强劲表现带动业绩改善实垂了 沪指盘中突破3700点!这些概念爆发→ 收评:港股恒指跌0.37% 科指跌0.97% 科网股走弱 保险股普涨 联想跌近6%实测是真的 叮当健康持续加码智能化建设:提质增效已见成效,毛利率显著提升专家已经证实 京东集团二季度收入收入3567亿元 同比增加22.4% 五霸争锋:新浪财经APP如何一骑绝尘——与东方财富、财联社、万得、雪球八大维度终极对决 央行8月15日将开展5000亿买断式逆回购操作 焦煤:交易所调整交易限额 焦煤期货见顶回落反转来了 寒武纪市值一度突破4000亿,二季度基金分歧加剧 京东:营销支出同比增长127.6%达270亿元官方处理结果 贯彻落实民营经济促进法,最高法指导意见来了→是真的吗? 西藏旅游:股东旅投集团拟减持不超过0.97%公司股份实测是真的 2025年中信用趋势|清洁能源发电:政策推动资本开支旺盛,外部支持有力,信用质量保持平稳是真的? 图解众望布艺中报:第二季度单季净利润同比减55.20%是真的吗? 华商基金指数增强家族重磅成员 华商沪深300指数增强即将结募后续反转 五霸争锋:新浪财经APP如何一骑绝尘——与东方财富、财联社、万得、雪球八大维度终极对决后续来了

一、问题

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

相关文章