如何在DirectX 10中正确更新顶点缓冲区

对于一些背景知识:我正在开发一个C ++项目,我正在尝试根据实时配置文件数据绘制对象的3D表示。分析数据是从外部分析硬件收集的。系统沿着物体移动,并以每秒300次的速率向我的软件提供配置文件切片。每个切片包含~8000个X-Y点的列表。探测器的移动由编码器记录。编码器信息提供扫描的第三维。 另一个需要注意的重要事项是剖面仪可以在物体上来回移动。当发生这种情况时,我想用新的切片(基于编码器位置)替换先前读取/绘制的切片。到目前为止,我通过切片的循环缓冲区来实现这一点,我通过编码器计数来存储。这也意味着我会想要在缓冲区填充时抛出切片并开始覆盖旧切片。为了在屏幕上显示适当数量的主题 - 我需要一次绘制1000条轮廓数据。现在我将对象渲染为点云。将来我们可能会尝试附加相邻切片并渲染为三角形列表。 我是DirectX的新手,但是使用书籍和在线示例我已经达到了用3D绘制对象的程度,但我确信我没有高效/正确地使用Vertex缓冲区。我发现的大多数例子都使用非常静态的模型。因此,它们倾向于使用它们的列表创建单个顶点缓冲区,然后通过矩阵变换进行操作。另一方面,当我从硬件中检索配置文件数据时,我将非常快速地更新场景。 目前我正在为我读入的每个切片创建一个新的顶点缓冲区。当我绘制场景时,我遍历我最多1000个缓冲区的列表并为每个缓冲区调用Draw()。我注意到如果我将一次绘制的顶点缓冲区的数量减少一半,我的FPS显着增加,而每个缓冲区的顶点数减半时几乎没有改善 - 所以我认为这表明多个顶点缓冲区这不是解决这个问题的正确方法。 所以对于我的问题的胆量......我想知道当Vertices如此频繁地改变时是否可以将所有这些顶点放在单个顶点缓冲区中。我可以更新现有顶点缓冲区中的点吗?或者我应该在每次更新场景时重新创建一个全新的缓冲区?要记住的最后一点是,每个切片的硬件点数会有所不同 - 因此,当涉及覆盖先前切片时,新切片可能比被替换的切片具有更多或更少的点。 谢谢你的时间。任何建议将不胜感激!     
已邀请:
只要使缓冲区动态化,就可以始终更新顶点缓冲区内的点(指定
D3D10_USAGE_DYNAMIC
并使用
ID3D10Device::CopySubresourceRegion
有效地仅更新部分缓冲区)。这应该比过于频繁地重新创建缓冲区更有效。 然而,每个切片具有不同的尺寸是不好的。您可以实现某种内存管理器以保持顶点缓冲区的整体碎片较低,或者这是使用多个vb不可避免的点。一种方法是将所有切片大小舍入到合理的限制,并且每个大小具有一个vb。     

要回复问题请先登录注册