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