现代GPU上的纹理变化(和其他状态变化)成本

时间:2011-07-20 23:05:49

标签: 3d xna directx gpu direct3d

我正在编写一个基于场景图的图形引擎,用于建模目的。我正在使用XNA 4。 在我读过的很多地方,渲染过程中应该最小化纹理变化(以及其他状态变化)(所以我必须按照材料等顺序排列我的基元)。

我在XNA 4中创建了一个小型测试应用程序,它使用单个纹理渲染数百个斯坦福兔子模型,然后切换2个不同的纹理。渲染时间没有差别(但我使用了小~100x100纹理)。

所以我的问题是:

  • 我真的应该关心按纹理/颜色/其他材质参数对基元进行排序吗?或者它在现代GPU上不太重要?
  • 如果我没有,可以预期的性能损失百分比是多少?
  • 是否还有其他状态变化会影响性能?
  • 我在哪里可以找到一些关于此的最新文献/最佳实践指南?

感谢您提供任何帮助或链接!

1 个答案:

答案 0 :(得分:8)

long 时间状态变化并不是真的很贵。 批次很贵。(状态变化需要新批次)。批处理基本上是对Draw*Primitives函数的调用。

This PDF from nVidia详细解释。它还提供了减少批次数的想法。

批次是基于CPU的限制(不是GPU)。该PDF列出了“< 130 tris / batch”作为提交批次主导性能的点,并且GPU闲置等待更多批次(details)。它还表示,每1帧可获得批量,每1GHz CPU功率可达60 FPS。 (尽管PDF有点陈旧,但这些数字有点过时了。)

我的answer on the gamedev site类似问题应提供更多详情。 This one too