在Direct3D 11中绘制具有不同数量原语的对象

Drawing objects in Direct3D 11 that have varying number of primitives

本文关键字:原语 对象 Direct3D 绘制      更新时间:2023-10-16

这是我的第一个问题,所以如果你对如何改进这个问题有任何建议,请随时告诉我:)

所以我的问题是:我有一个改变每一帧的对象,这导致了我计划通过管道发送的不同数量的顶点。显然,我不能即时改变顶点缓冲区的大小,那么最好的方法是什么呢?

以下是我的一些想法:

  1. 创建一个大小为n的顶点缓冲区,并简单地以n的集合传递顶点。缺点:一些顶点通过VS多次,所以性能略有下降(可能不明显),必须每帧调用Map/Unmap几次,这可能是有问题的。

  2. 创建一个巨大的顶点缓冲区,将容纳足够的顶点,我的对象永远不会超过缓冲区的大小。缺点:因为我事先不知道我的对象将有多少顶点,所以可能很难预测这个缓冲区的大小。此外,缓冲区可能会占用太多的空间。

  3. 每一帧,创建一个正确大小的新顶点缓冲区,并调用IASetVertexBuffer。缺点:这可能会有很大的性能问题…

我很感谢你们的任何想法,或者建议使用这三个中的哪一个!:)

1/这并不理想,因为正如您所说,您需要多次映射/取消映射,并且在两者之间进行绘制调用。您可以通过牺牲性能来换取更少的内存使用,在现代卡上(以千兆字节为单位),内存不太可能成为问题(如评论中提到的)。

2/与1相反,您需要单个Map/Unmap和单个绘制(您也可以在DeviceContext-> draw中指定顶点计数,以确保仅绘制缓冲区的相关部分)。这将是你性能方面的最佳选择,并且它应该不会太难定义某种形式的最大值(即使100万个多边形也没有那么多内存,并且你将很难让你的CPU每帧提供那么多数据)。

3/我在你的用例中没有看到任何好的好处(当你对一些不可变资源进行异步加载时,重新创建资源是常见的,所以它并不真正适用于这里)。

所以选择2,如果有一天内存成为一个问题,很容易回到1,但我怀疑这种情况永远不会发生。