Unity开发踩坑-粒子特效(ParticleSystem)性能优化
Posted 今天不走 明天就要跑了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity开发踩坑-粒子特效(ParticleSystem)性能优化相关的知识,希望对你有一定的参考价值。
开游戏开发中,会常常遇到用粒子特效来制作技能特效,子弹特效,或者装备特效等。
但是对于初学者来说常常会遇到如果屏幕出现大量同一个特效时,会遇到性能的问题不知道怎么优化。
今天我就来举个例子带着大家一起尝试优化出现大批量例子特效之后遇到的性能问题:
例如:我们在游戏中有一个例子特效 这个特效采用3种不同的材质球如下:
我们开发帧调试器(FrameDebug)看看当前的情况:对于FrameDebug如何使用,里面的信息代表什么意思,我们后面的文章再来介绍。
由图可以看出当前的三个粒子对应了三个不同的 DrawTransparentObjects
透明对象:由于我们材质球采用的是SurfaceType是 transparent 所以在渲染绘制时 处于 DrawTransparentObjects这个层级。
此时,我们将当前的这个粒子特效多复制几分看看情况
由上图可以很明显的看出:
虽然我们都是一模一样的例子特效,由于我们复制了23份出来 那么渲染帧调试器的透明对象,比最初多了很多很多。
这是不符合,我们优化时的规律的:同一个材质球,在渲染时,竟可能全部合批处理
这时候细心的同学可能会问,复制了23分 +最开始的一份 = 24*3=72个 DrawTransparentObjects,为什么图中只有60
疑,渲染帧中怎么出现了Draw Dynamic?
我们看镜头中DrawCall 为 3 那么我们在看看其他的DrawCall为多少
通过图可以看出 是不是没有? 没有就是默认DrawCall为1的意思,那么就奇怪了 为什么有的为3有的为1呢?
这就是我们本文中要提到的粒子特效合批优化的内容
来跟着我一起简单的把当前粒子特效修改一下
跟着我入上图,将每个粒子用到不同材质球的 OrderInLayer 划分为单独一个层
再运行看看渲染帧:
是不是神奇的事情发生了,渲染调试器的DrawTransparentObjects 有最初的60 变了3个, 正好我们当前粒子特效只有三个材质球。
然后每一帧里面的渲染对象突然大幅度猛降 。 那么我们对粒子特效优化的效果是不是就达成了。
重点:其实在调试渲染帧调试器时,不管是粒子特效,还是模型对象,优化的思路都一样,就是要将同一材质的对象,想办法放一块(也就是将渲染层级调到一起),那么URP在做渲染时,就会自动将相同材质球的内容给我们优化掉。 我们没有调整粒子特效的渲染层级时,三个粒子的渲染层级都是0,那么在绘制时,就是按照顺序往下绘制,正好我们三个材质球的顺序都是 1 2 3这样隔开的,所以相同的材质球没办法在一块,我们就需要手动调整粒子的渲染层级(模型的优化原理也一样)
对于什么URP在渲染时,时按照这样的顺序来的,我这儿要推荐一个unity官方视频讲解 引擎底层的渲染逻辑内容:
00:25:50 《SRP底层渲染流程及原理》by Unity高级解决方案工程师 李中元
该视频看了之后再看我这篇文章,就很容易秒懂。
但是有一点得注意:URP中相同材质球合批处理了 不是说我们真实的drawcall就降低了 我们可以看到 单个里面的drawcall 是24
另外三个也是24*3 = 72
如下图所示:URP是通过减少每一帧中,CBFFER环境的数量来提升优化,也就是说,在一帧里面,渲染同一个材质球的24个drawcall打包一起,传入到了GPU。前提的是SRP Batch开关要开启。
如何打开:SRP Batch的开关,找到UniversalRenderPipelineAsset文件如下图
如果需要深入理解URP里面的内容可以看UNITY官方的教程
https://blog.unity.com/technology/srp-batcher-speed-up-your-rendering
本次结束到这儿,喜好的朋友麻烦点一健三连,谢谢。
UNIYT技术交流群 QQ群:68356214
以上是关于Unity开发踩坑-粒子特效(ParticleSystem)性能优化的主要内容,如果未能解决你的问题,请参考以下文章
unity如何在粒子层下添加粒子,怎么在一个特效里添加多个不同的粒子
unity3d 在代码中怎样控制粒子特效的重新播放与停止?答案最好详细点,可以加分