5

对于一点背景:我正在使用 C++ 进行一个项目,在该项目中我试图根据实时配置文件数据绘制对象的 3D 表示。分析数据是从外部分析硬件收集的。该系统以每秒 300 次的速度沿着一个对象移动,为我的软件提供了一个剖面切片。每个切片由一个 ~8000 个 XY 点的列表组成。轮廓仪的运动由编码器记录。编码器信息提供了扫描的第三维。

另一个需要注意的重要事项是分析器可能会在对象上来回移动。发生这种情况时,我想用新的切片替换以前读取/绘制的切片(基于编码器位置)。到目前为止,我正在使用按编码器计数存储的切片循环缓冲区来实现这一点。这也意味着当缓冲区填满并开始覆盖旧切片时,我将要丢弃切片。为了在屏幕上显示适当数量的主题 - 我需要一次绘制 1000 个剖面数据。现在我将对象渲染为点云。将来我们可能会尝试附加相邻的切片并渲染为三角形列表。

我是 DirectX 的新手,但是使用书籍和在线示例,我已经到了在 3D 中绘制对象的地步,但我确信我没有有效/正确地使用顶点缓冲区。我发现的大多数示例都适用于非常静态的模型。因此,他们倾向于使用其点列表创建单个顶点缓冲区,然后仅通过矩阵变换进行操作。另一方面,当我从我们的硬件中检索配置文件数据时,我将非常快速地更新场景。

目前,我正在为我读入的每个切片创建一个新的顶点缓冲区。当我绘制场景时,我循环遍历最多 1000 个缓冲区的列表,并为每个缓冲区调用 Draw()。我注意到,如果我将一次绘制的顶点缓冲区数量减少一半,我的 FPS 会显着提高,而将每个缓冲区的顶点点数量减半时几乎没有改善 - 所以我认为这表明多个顶点缓冲区不是解决这个问题的正确方法。

所以对于我的问题的胆量......我想知道当顶点变化如此频繁时,我是否可以将所有这些顶点放在一个顶点缓冲区中。我可以更新现有顶点缓冲区中的点吗?还是应该在每次更新场景时重新创建一个全新的缓冲区?最后要记住的一件事是,硬件中每个切片的点数会有所不同 - 因此,在覆盖以前的切片时,新切片的点数可能比被替换的切片多或少。

谢谢你的时间。任何建议将不胜感激!

4

1 回答 1

3

只要您使缓冲区动态化(指定D3D10_USAGE_DYNAMIC并用于ID3D10Device::CopySubresourceRegion有效地仅更新缓冲区的一部分),您就可以随时更新顶点缓冲区中的点。这应该比过于频繁地重新创建缓冲区更有效。

然而,为每个切片设置不同的大小是不好的。您可以实现某种内存管理器来保持顶点缓冲区的整体碎片较低,或者这是使用多个 vb 是不可避免的。一种方法是将所有切片大小四舍五入到合理的限制,并为每个大小设置一个 vb。

于 2011-04-01T15:58:13.757 回答