著名的 Nvidia 的“Batch, Batch, Batch”建议是具有大量小物体的场景的必备配方。诀窍在于将小型绘制调用组合在一起,因此 GPU 始终有三角形需要处理,而无需等待 CPU。这在 D3D9 的时候是必不可少的。希望现代网格着色器或实例化能够在现代 API 和 GPU 上很好地处理小批量任务。
但是计算呢?一百个空的计算着色器就可以了。一千是一个可能花费高达 10 毫秒的问题,特别是如果着色器是间接的。API 并没有试图解决这个问题。我们仍然没有可调用的着色器和multiDispachIndirect()。我们能用它做什么呢?是的,老套的“批量、批量、批量”又来了。
Tellusim 管道完全由 GPU 驱动,这意味着我们有大量的调度。当我们只有几个对象时,GPU 驱动的管道比 CPU 驱动的管道慢。当场景不那么简单时,它真的很闪耀。我们有来自计算着色器调度的固定开销。对于单视口或多视口渲染,这种开销是相同的,因为我们正在为每个计算着色器调用执行“调度,调度,调度”。这使得立体或多视口渲染比串行渲染更快,因此我们可以轻松地从单个 GPU 处理多个耳机或连接尽可能多的显示器。
具有独特材质的 21K 动态对象、具有四个分割 PSSM 阴影贴图的灯光、六个 1024×1024 视口和零 CPU 负载:
VK 串行/并行 | D3D12串行/并行 | D3D11 串行/并行 | GL串行/并行 | 金属串行/并行 | |
---|---|---|---|---|---|
英伟达精视3090 | 163/255帧/秒 | 159/209帧/秒 | 64/112帧 | 139/224帧/秒 | |
GeForce 2080 钛 | 94/169 帧/秒 | 129/167 帧/秒 | 76/114帧/秒 | 不适用 | |
Radeon 6900 XT | 180/211帧/秒 | 162/188帧 | 156/180帧/秒 | 165/188帧/秒 | |
Radeon 6700 XT | 126/142帧/秒 | 127/139帧/秒 | 122/136帧/秒 | 132/146帧/秒 | |
Radeon 6600 | 66/74 帧/秒 | ||||
英特尔Arc A380 | 29/31 帧 | 2/3 帧/秒 | 5/5 帧/秒 | 不适用 | |
苹果M1 Max | 58/71 帧/秒 | ||||
苹果M1 | 25/27 帧/秒 |
我们在 Nvidia 上的性能提高了 50%。我们的建议很简单:将相同计算着色器的调度组合在一起,并最大限度地减少计算着色器切换的数量。因为a:D;乙:D;一个:D;b : D比a : D , D慢;乙:D,D。