gpt4 book ai didi

c++ - 在 d3d11 的图形管道中放置东西的哪种方法更有效?

转载 作者:行者123 更新时间:2023-11-30 03:02:20 24 4
gpt4 key购买 nike

因此,通过查看示例和教程,似乎在管道中放置缓冲区的最常见方法是,每个模型对象都有自己的顶点缓冲区,然后在填充缓冲区后锁定、设置缓冲区,为每个模型单独的缓冲区解锁、设置着色器、绘制和冲洗/重复。在我看来,所有锁定和解锁都会减慢速度。

所以我想知道模型对象是否可以改为将它们的所有顶点聚合到一个大数组中,所有索引都在一个大数组中,创建一个大缓冲区,锁定一次,设置缓冲区一次,解锁,然后切换出去着色器并根据需要使用这些着色器绘制尽可能多的多边形,然后像以前一样沿着缓冲区绘制和切换着色器工作,而不是每次绘制前都必须在管道中锁定和删除更多顶点。

这会不会更有效率,或者您认为所有涉及的簿记的开销(例如,从索引 a 到索引 b,使用此着色器)只会使它的工作量超出其值(value)?

此外,如果我在这里遗漏了 d3d 的概念,请通知我。 (我是新来的)

编辑

由于巨大的误解,我提到锁定和解锁的任何地方实际上应该只是调用 IASetVertexBuffer/IASetIndexBuffer。 “修改”的问题或多或少是:

将场景中所有模型的顶点填充到一个单独的缓冲区中,然后简单地调用一次 IASetVertexBuffer 是否完全可以提高性能?

最佳答案

So from looking around at examples and tutorials

停止。大多数“示例和教程”都旨在展示最佳性能实践。除非他们专门关于最佳性能实践。他们试图以最清晰、最简洁的方式展示如何执行任务 X。优化完全是另一个问题。优化的代码比非优化的代码更不清晰和干净;因此,许多优化会妨碍教程的既定目的。

因此,永远不要假设仅仅因为教程以某种方式完成,那是做某事的最快方式。这只是一种方法。

then after the buffers are filled, they lock, set the buffers, unlock, set shaders, draw, and rinse/repeat for every models individual buffer.

加锁和解锁是为了修改缓冲区。如果你不修改它......你为什么要锁定它?如果您正在修改它,那么您就是在进行某种形式的缓冲流,这需要特殊处理才能使其高效。

如果您正在进行流式传输,那么您应该问另一个不同的问题(即:如何进行高性能顶点流式传输)。

这并不是说将多个对象的数据放在一个缓冲区中不是一个好主意。但如果是的话,其原因与锁定和解锁关系不大,而更多地与通过一次绘制调用绘制多个对象的可能性有关。

关于c++ - 在 d3d11 的图形管道中放置东西的哪种方法更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com