DirectX 9.0顶点缓冲区更新

时间:2012-03-02 17:38:39

标签: directx-9

我使用DirectX 9.0创建了一个小型3D查看器应用程序。现在我想添加一些编辑功能。假设我想编辑一个大的多边形。当用户编辑形状时,将添加,删除和移动顶点。现在,每个多边形都存储为顶点缓冲区。 我的问题是,在用户编辑形状时,存储和显示形状的最佳方法是什么?如果我每次发生变化时都会破坏并重新创建顶点缓冲区,我相信它会过于耗费资源并且不是最理想的。

我虽然我也应该在主帖上问我的问题,所以这里是:

我有三个不同的任务,其中两个我不知道如何实施:
1)编辑顶点:简单,我将用VB中的新位置更新旧顶点 2)删除顶点:这里发生了什么?如何在不创建新VB的情况下将其删除?我应该添加一个空白的VB吗? 3)添加顶点:这里怎么样?我可以更改动态VB的长度并在末尾添加顶点吗?

我相信另一个想法会起作用:
1)编辑很容易 2)删除只是意味着我将覆盖已删除的顶点,可能是前一个或下一个顶点的位置,因此它将不可见。
3)Addition将创建一个新的顶点缓冲区,但会像Vector或List一样调整大小。每次重新创建它的大小都会像是一样 NewSize = OldSize * 1.1(增加10%)
因此,连续添加不必重新创建VB 所以1& 2永远不会创建一个新的VB,3有时可能会创建一个。这听起来怎么样?

1 个答案:

答案 0 :(得分:4)

您不必每帧都销毁缓冲区。创建一个动态缓冲区。

如果您还没有,请查看文章Using Vertex Buffers With DirectX

  

对于动态顶点缓冲区,其中包含有关场景中经常更改的基元的信息,我们需要为Usage指定D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY标志,为池指定D3DPOOL_DEFAULT标志。

请记住,数据仍然必须在每次更新时发送到管道。因此,与具有一致数据的静态缓冲区相比,肯定会有一些性能成本。

此外,您应该尝试将缓冲区更新和缓冲区切换保持在最低限度。您的应用程序中是否有许多此类可编辑多边形?如果答案是,可以考虑将它们放在一个缓冲区中。


图形/游戏开发者的官方Q / A网站:https://gamedev.stackexchange.com/


更新

听起来不错。

  另一方面,

动态顶点缓冲区每帧都被填充和抛弃。

这取自文章,几乎是 1。 2。的答案。我不会更新单个顶点或仔细选择应覆盖哪些顶点,而是更新整个缓冲区内容。无论如何必须将完整的缓冲区发送到设备。你必须测试它,只是为了确定。

关于 3。:创建缓冲区后无法更改缓冲区的大小,但可以创建比实际需要的缓冲区更大的缓冲区。所以尽量估计一个好的边际。如果缓冲区仍然太小,则创建一个新缓冲区。没有其他解决方案。您已经找到了可能的动态增加缓冲区大小的算法。

在图形性能方面有很多参数,几乎不可能给出明确的答案。你是否已经遇到限制?如果没有,不要打扰太多。在你还在发展的同时慷慨地利用你的资源。