当场景中存在大量 materialInstanceConstant 时,Nanite 在 BasePass 中消耗较高,大量被剔除掉的物体对应的材质还是进行了 DispatchIndirect API 的调用,并且通过 PIX 截取之后发现,这些 IndirectArg 为 (0, 1, 1) 的 event 耗时居然和真正被绘制的 event 耗时相差不大,这就导致了在材质较为复杂,数量比较大的时候,这部分耗时是不可忽略的并且占用了大部分 GPU 时间,有什么方法可以提前对 material 进行剔除从而优化最终 shading bin 数量吗?
Hi,
你好,这个问题也是我们已知的问题,PC平台虽然有WorkGraph,但是因为其自身性能目前还不佳,所以没有做到类似主机上跳过空IndirectDispatch的功能,而且在PC平台大部分GPU,CS的空IndirectDispatch比Graphic的耗时更加严重,所以问题比较明显。我们尝试过用D3D12的Predication来跳过空dispatch,但是好像不是所有GPU Vendor都有同样的效果,所以这个方案也不算很有效。
不够我们最近在利用Bindless来减少MaterialInstance造成的Raster Bin和Shading Bin的数量,目前只是初步做了验证,CitySample上,Dispatch的数量从3600左右降到了200左右,性能上也有明显的提升(不同视角下表现不同,但0.5ms是正常的)。不过这个改动可能要到5.8的版本才能完成。如果需要,可以等段时间再联系我,我可以看看是否提交。
感谢回复~
我们目前测试 RTX2060 系列显卡 Nanite 的性能非常差,尤其是地形相关,想请问目前对于中配机型的渲染方案有什么建议,是否建议开启 nanite?
此外我们还发现: 在中低配机(2060)启用时域抗锯齿(如TSR ,DLSS等后),引入的jitter 会导致 VisBuffer::PostPass 以及 NaniteBasePass 有异常的消耗提升,不知道你们目前有没有在处理呢?
一般情况下,如果资产使用适合Nanite(都是Opaque材质,没有WPO,没有Mask),在Drawcall数量比较多的情况下,使用Nanite应该都会有正向收益,但是如果场景中比如Mask和WPO材质的Nanite资产比较多,或者有之前提到的大量空Dispatch的情况,可能目前确实不适合用Nanite。
引入的jitter 会导致 VisBuffer::PostPass 以及 NaniteBasePass这种情况我暂时没有感知到,jitter理论上应该只是对相机做了像素级的偏移,我不确定为什么会有消耗的提升(HZB culling失败?),我目前没有合适的设备测试,不知道能否在2080 ti设备上,提供一个复现的工程或者步骤,我可以尝试验证一下。