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

Posted

技术标签:

【中文标题】现代 GPU 上的纹理更改(和其他状态更改)成本【英文标题】:Texture change (and other state-change) costs on modern GPUs 【发布时间】:2011-10-09 19:41:11 【问题描述】:

我正在为建模目的编写基于场景图的图形引擎。我正在使用 XNA 4。 在我读过的许多地方,纹理变化(和其他状态变化)应该在渲染过程中最小化(所以我必须按材质等对我的图元进行排序)。

我在 XNA 4 中创建了一个小型测试应用程序,它使用单个纹理渲染数百个 stanford bunny 模型,然后切换 2 个不同的纹理执行相同的操作。渲染时间没有区别(但是我使用了 ~100x100 的小纹理)。

所以我的问题是:

我真的应该关心按纹理/颜色/其他材质参数对图元进行排序吗?还是它在现代 GPU 上不那么重要了? 如果不这样做,预期的性能损失百分比是多少? 是否有任何其他状态变化会影响性能? 我在哪里可以找到有关这方面的最新文献/最佳实践指南?

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

【问题讨论】:

如果您在这里没有得到任何回复,可以尝试在 gamedev.stackexchange.com 上提问 【参考方案1】:

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

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

批次是基于 CPU 的限制(不是 GPU)。该 PDF 将“details)。它还表示,每帧 60 FPS,每 1GHz 的 CPU 功率专用于提交批次,您可以获得大约 400 个批次。 (虽然 PDF 有点旧,所以这些数字有点过时了。)

我的answer on the gamedev site 对类似问题应提供更多详细信息。 This one too.

【讨论】:

感谢您的回答,帮助很大,这正是我需要的!

以上是关于现代 GPU 上的纹理更改(和其他状态更改)成本的主要内容,如果未能解决你的问题,请参考以下文章

GPU硬件加速

使用纹理更改帧部分的 alpha 值

GPU上的纹理图像处理?

OpenGL 纹理未显示的常见故障排除步骤是啥?

如何在three.js中为.fbx模型应用纹理?

将渲染设备从 Sandy Bridge GPU 更改为主 GPU