Unity ImageEffect 效率分析

Unity ImageEffect 效率分析

作者:news 发表时间:2025-08-04
饰品董秘薪酬PK:迪阿股份业绩断崖式下滑、市值缩水超500亿 却为董秘黄水荣支付127万年薪反转来了 【光大金融】如何看待股债跷跷板和8月流动性?最新报道 神马股份:拟收购尼龙化工10.27%股权 【光大金融】如何看待股债跷跷板和8月流动性?后续来了 瑞银:谁来接“空出来”的理事,他就是下一任美联储老大?秒懂 读客文化:截至2025年7月18日,公司的股东人数为17319户 官方已经证实 上海洗霸:聘任戴帆为公司副总裁这么做真的好么? 是真的? 期卷“V型”翻红!焦煤涨超2%!钢价能否止跌企稳?又一个里程碑 【光大金融】如何看待股债跷跷板和8月流动性?记者时时跟进 星展:升泓富产业信托目标价至1.71港元 料全年每基金单位分派增3%反转来了 爆冷!股市怎么办?后续反转 瑞银:谁来接“空出来”的理事,他就是下一任美联储老大? 对标Figma 万兴科技孵化Pixso已获中金鑫智百度风投深高新投复星创富等投资官方已经证实 A股午后大幅上涨,三大股指涨幅明显:国防军工领涨,近3900股飘红 对标Figma 万兴科技孵化Pixso已获中金鑫智百度风投深高新投复星创富等投资 省广集团:不存在应披露而未披露事项 脑机接口技术不断发展,我们准备好了吗实测是真的 突发!688184,共同控制人被立案侦查!后续会怎么发展 港股IPO新规为发行人“松绑”,将带来哪些变化?官方已经证实 公募REITs队伍持续壮大!上市数量增至71只,还有新品在路上是真的吗? 英国石油公司(BP)营收预期比行业生产数据更悲观最新报道 彪马新任总裁上任时,品牌落后于阿迪达斯,耐克官方通报 500亿欧元的激进销售目标促使J. Martins考虑并购秒懂 诺和诺德的困境对丹麦经济构成严重威胁官方通报来了 国际资本集团将以 2 亿英镑收购英国三座机场秒懂 南非汽车供应商遭遇 4100 万美元关税冲击学习了 诺和诺德的困境对丹麦经济构成严重威胁又一个里程碑 300264,筹划控制权变更!停牌!最新进展 500亿欧元的激进销售目标促使J. Martins考虑并购是真的? 高温黄色预警继续 未来一周陕川渝鄂部分地区可达40℃实测是真的 港股IPO新规为发行人“松绑”,将带来哪些变化?又一个里程碑 光启研究院十五年的超材料突围战 铸就龙国战略新兴产业科技力量 安踏回应收购美国锐步传闻最新进展 300264,筹划控制权变更!停牌!学习了 刚刚,刘强东花180亿买了个新平台反转来了 瑞银:美联储理事库格勒意外辞职 鲍威尔继任战提前打响 芯导科技拟购买相关公司股权 实现对瞬雷科技全资控股后续反转 457只个股流通市值不足20亿元后续来了 国发股份定增募资引猜想:加码“AI+健康”或跨界布局算力? 于正邀你“穿越”吃御膳!华帝又在微综艺里把“国潮”玩出花 风雨之中勇担当 远洋生态公司驰援龙国首都怀柔暴雨灾区专家已经证实 【盘前三分钟】8月4日ETF早知道 晨报|关注AI、创新药、资源、恒科以及科创板 香港中旅盈警后跌超4% 预期上半年股东应占亏损超过0.70亿港元官方通报来了 【华鑫固收&资配】风险偏好终现回落——资产配置周报(2025-8-3)官方通报 央行公开市场开展5448亿元逆回购操作

一、问题

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

相关文章