Unity 特效drawcall优化

参考原文地址:

1.http://blog.csdn.net/github_32062421/article/details/49203501

2.https://www.cnblogs.com/wantnon/p/5619386.html

在做动作游戏中总会有很多重复的特效出现。比如:受击特效,治疗特效等公用特效。我们的程序跟我们说为了减少DC(DrawCall),要求说受击后播放了受击特效后,再次受击是不会再次播放一个受击特效的。要等第一个受击特效播放完后如果还受击了那再播放受击。

一开始我是拒绝的,但是因为我们项目DC的确蛮高了。后面我还是答应了。

最后测试后打击感差了2的1024次方。最后为了解决这个问题,我研究了Unity3d粒子系统。并做了测试。

Unity 特效drawcall优化_第1张图片

这是我们的受击特效。DC是5个

如果创建N个的话 DC会怎么样呢?

Unity 特效drawcall优化_第2张图片

可以看到Batches 1257....难怪卡死了....

Unity 特效drawcall优化_第3张图片Unity 特效drawcall优化_第4张图片

这个特效是由5个例子特效组成的。我把每个粒子特效的OrderInLayer重新设置。2000,2001,2002,2003,2004

确保每个粒子的OrderInLayer不同.不要重复.


接下来就是见证奇迹的时候了......0 0、

Unity 特效drawcall优化_第5张图片

可以看到重复创建的特效都跑到Saved by batching了。

大家理解了吗?特效又有新的事情要做了。


PS:关于单个特效也是能优化的。原理是一样的

Unity 特效drawcall优化_第6张图片Unity 特效drawcall优化_第7张图片

这是一个散射子弹的特效。看这个特效的结构是相同的特效复制了5份换成了不同的角度。

我还是一样的把OrderInLayer重新设置了。不过每个sq_skill_3_ball,sq_skill_3_fire,sq_skill_3_light都是设置成一样的。

再一次见证奇迹的时刻- -、

Unity 特效drawcall优化_第8张图片

没修改前DC的顶峰会随时间在12-16徘徊。

修改后DC的顶峰稳定在8.

你懂了吗?快叫特效去改吧

unity, particleSystem的batch优化

一,单个光效的batch优化

理想状态下一个由若干粒子堆出来的光效只需要一至两个draw call:

 (1)至多使用alpha blend(垫底色)和additive(曝光)两个材质球,两shader均需要支持顶点色,不需要带tint color。

 (2)使用粒子系统的Start Color和Color over Lifetime来改变粒子颜色(它们都是顶点色),而不是使用shader上的tint color。

 (3)相同材质的粒子放到一个图集,使用粒子系统的Texture Sheet Animation来切分图集。

 (4)不使用mesh作为粒子(mesh粒子不会合批)。

 (5)不同材质的发射器赋予不同Order in layer值,相同材质的发射器使用相同的Order in layer值,有助于避免材质打断(即避免出现“materialA,materialB,materialA”的情况)。

 (6)开启dynamic batch。

二,多个相同光效的batch优化

如果场景中有多个光效A,设单个光效A的draw call数为n,那么我们希望所有的光效A加起来只消耗n个draw call,而不是每个光效A都单独消耗n个draw call。


总结:

根据上面的方法复制多个相同的特效,位置不同的情况下,设置Order In Layer之后SetPassCall的数量和一个是一样的,不设置就是乘法运算。但是修改Order In Layer会影响到粒子的渲染先后顺序,可能导致效果发生变化(之前的效果全都是0),而且如果有两种特效在重叠,会出现不管位置如何,Order In Layer大的都会在上面,看起来不正常,所以使用之前可能还需要考虑更多的东西。

有时候就觉得,可能一个不起眼的设置,就会对结果有巨大的影响,所以要想用Unity做好游戏,得把里面所有的模块研究透彻才行。

你可能感兴趣的:(unity学习笔记)