如何解决穿插易导致半透明物体合批失败

如何解决穿插易导致半透明物体合批失败

1)如何解决穿插易导致半透明物体合批失败
2)SRP Batcher与GPU Instancing性能对比如何
3)项目升级到2022出现渲染错误和闪退的疑问
4)PostLateUpdate.UpdateAllRenders中调用SkinnedMeshPrepareDispatchUpdate开销过大问题


这是第413篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:793972859

Rendering

Q1:请问半透明Shader,距离穿插,打断SRPBatcher。有什么通用解法?比如一个火焰特效,用了ab2个粒子,分别2个Shader,那么10个火焰就是ab ab ab......这样20个DrawCall吗?但完全无法合批。

由于半透明开销比较大。而且需要渲染顺序严格导致了一些优化失效。大家有什么好的解法吗?

A1:调整RenderQueue。

感谢小波@UWA问答社区提供了回答

A2:不透明可以调RenderQueue,半透明不好调,可能会影响渲染结果。

感谢AQ(Richard Pan)@UWA问答社区提供了回答

Q2:那比如玩家丢出的燃烧瓶,多少米合并成一个?如果很远,半透明物体在火堆之间就出错明显。我之前是3米合成一次顺序,提升不明显。

A3:我是直接不同材质用不同队列,牺牲了一些顺序正确性,主要用在团战时候大量技能特效上,本身画面很乱,顺序错误感受不出来,至于场景中的常驻特效,还是要保证顺序正确性,不去调队列。

对应性能好的机器保证正确性,性能差点的保证性能,忽略点正确性。

感谢AQ(Richard Pan)@UWA问答社区提供了回答

A4:一个燃烧瓶丢出来8份火焰实例,每个实例3个粒子发射器且Shader不同,导致一堆开销。尝试燃烧瓶互相顺序不严谨,内部定死顺序看看。

感谢偶尔不帅@UWA问答社区提供了回答

Q3:强制改变渲染顺序粒子是改下图这里好:

还是材质的Queue好:

A5:我是改材质的Queue。

感谢AQ(Richard Pan)@UWA问答社区提供了回答

A6:半透明大部分情况是放弃跨发射器的合批优化。整理了以下几种办法供参考,一种办法就是将两个材质合并为一个,这样就连上了;另外就是在Batch的时候判断屏幕Bounds,不重叠的时候进行批次合并;还有种办法是粒子实时Batch成序列帧后使用,远处的粒子可以这样处理,这样这些粒子都可以一个批次画完,毕竟远处不管是大小还是帧率都很低,这样做反而可能是合算的。

感谢flashyiyi@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/675673e5682c7e5cd61bf9bf


Rendering

Q:SRP Batcher与GPU Instancing性能对比如何?从什么角度来分析量化这个问题,比如最终向GPU提交的Commands数量,还有不同Command的成本?

A1:没有可比性。SRP Batch是GPU层的动静分离,不会改变DC数。完全可以SRP Batch+ECS或者SRP Batch+GPU Instance。

感谢沈杰@UWA问答社区提供了回答

A2:可以复合使用:一般3D渲染物体走SRP Batcher,Shader变体相同即可合批;大量重复同种物体可以考虑选用GPU Instancing,对于一些带有动画的对象还能同时降低其动画耗时,但是要注意相关的分组处理和Shader支持,否则可能出现负优化。

具体还是建议在自己项目中测试对比两个方案,用数据说话。

感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6751b12c3d306f3e9d594dbc


Editor

Q:为了修复Bug,项目从2020.3.42f1升级到2022.3.28f1,URP从10.10.1升到了14.0.10。

目前自测没什么问题,担心发布后一些特殊机型出现渲染错误甚至闪退的情况。请问有用这个版本的吗,能否给点建议方便自查?

针对以上问题,有经验的朋友欢迎转至社区交流:
https://answer.uwa4d.com/question/675052e3682c7e5cd61bf9bc


Rendering

Q:PostLateUpdate.UpdateAllRenders中调用SkinnedMeshPrepareDispatchUpdate开销过大,如下图,这个只执行了一帧,似乎是在计算Mesh的边界,这个函数可以避免调用吗?

针对以上问题,有经验的朋友欢迎转至社区交流:
https://answer.uwa4d.com/question/6750036d3d306f3e9d594dbb

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859