我在Metal中实现了Bezier曲线,希望实现卓越的性能 . 虽然速度非常好,但我看到数字低于预期的性能(相对于各种设备的三角形/秒规格) .

enter image description here

具体来说,当我更改某些参数时,我对GPU的行为感到困惑 . 我正在使用 drawIndexedPrimitives() 渲染数千条贝塞尔曲线 . 每个实例表示一条曲线,每个实例的顶点数表示每条曲线使用的三角形数 .

我传递给顶点着色器的唯一缓冲区是每个实例的参数缓冲区,没有传递每顶点数据 . 实际的贝塞尔曲线点在顶点着色器 without any per-vertex data being loaded 中计算 .

这就是让我困惑的事: I can dramatically increase the number of vertexes per instance without affecting performance much, but upping the number of instances directly increases the GPU frame processing time.

我的期望是GPU不应该关心我是否添加实例或顶点 - 更多的顶点意味着更多的工作 . 我错过了什么?

实际性能数字:

对于一个性能示例,就三角形/秒而言,iPad Pro似乎实现了大约2000条曲线,每条曲线由200个三角形组成,每个大约40FPS(大约25ms /帧) . 这相当于大约16M三角形/秒填充率,这明显低于该设备的预期性能 .

在同一台iPad Pro上,将每曲线三角形的数量从200倍增加到400只会使每帧时间增加到大约31毫秒 . 在我们基本上将GPU的工作量增加一倍之后,这个数字增加了24%!如果我们将曲线数量加倍(将每曲线三角形数量保持为200),则每帧的性能下降到大约47ms .

请注意,在这两种情况下,GPU必须渲染完全相同数量的三角形 - 它们之间有什么不同?

完整代码可在GitHub上找到 .