Unity特效drawcall优化
参考原⽂地址:
在做动作游戏中总会有很多重复的特效出现。⽐如:受击特效,特效等公⽤特效。我们的程序跟我们说为了减少
DC(DrawCall),要求说受击后播放了受击特效后,再次受击是不会再次播放⼀个受击特效的。要等第⼀个受击特效播放完后如果还受击了那再播放受击。
⼀开始我是拒绝的,但是因为我们项⽬DC的确蛮⾼了。后⾯我还是答应了。
最后测试后打击感差了2的1024次⽅。最后为了解决这个问题,我研究了Unity3d粒⼦系统。并做了测试。
这是我们的受击特效。DC是5个
如果创建N个的话 DC会怎么样呢?
可以看到难怪卡死了....
这个特效是由5个例⼦特效组成的。我把每个粒⼦特效的OrderInLayer 重新设置。2000,2001,2002,2003,2004
确保每个粒⼦的OrderInLayer 不同.不要重复.
接下来就是见证奇迹的时候了......0 0、
可以看到重复创建的特效都跑到Saved by batching 了。
⼤家理解了吗?特效⼜有新的事情要做了。
PS :关于单个特效也是能优化的。原理是⼀样的
这是⼀个散射⼦弹的特效。看这个特效的结构是相同的特效复制了5份换成了不同的⾓度。
我还是⼀样的把OrderInLayer 重新设置了。不过每个sq_skill_3_ball ,sq_skill_3_fire ,sq_skill_3_light 都是设置成⼀样的。再⼀次见证奇迹的时刻- -、
没修改前DC的顶峰会随时间在12-16徘徊。
修改后DC的顶峰稳定在8.
你懂了吗?快叫特效去改吧
⼀,单个光效的batch优化
理想状态下⼀个由若⼲粒⼦堆出来的光效只需要⼀⾄两个draw call:
(1)⾄多使⽤alpha blend(垫底⾊)和additive(曝光)两个材质球,两shader均需要⽀持顶点⾊,不需要带tint color。
unity3d animation(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做好游戏,得把⾥⾯所有的模块研究透彻才⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论