我使用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有时可能会创建一个。这听起来怎么样?
答案 0 :(得分:4)
您不必每帧都销毁缓冲区。创建一个动态缓冲区。
如果您还没有,请查看文章Using Vertex Buffers With DirectX:
对于动态顶点缓冲区,其中包含有关场景中经常更改的基元的信息,我们需要为Usage指定
D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY
标志,为池指定D3DPOOL_DEFAULT
标志。
请记住,数据仍然必须在每次更新时发送到管道。因此,与具有一致数据的静态缓冲区相比,肯定会有一些性能成本。
此外,您应该尝试将缓冲区更新和缓冲区切换保持在最低限度。您的应用程序中是否有许多此类可编辑多边形?如果答案是是,可以考虑将它们放在一个缓冲区中。
图形/游戏开发者的官方Q / A网站:https://gamedev.stackexchange.com/
听起来不错。
另一方面,动态顶点缓冲区每帧都被填充和抛弃。
这取自文章,几乎是 1。和 2。的答案。我不会更新单个顶点或仔细选择应覆盖哪些顶点,而是更新整个缓冲区内容。无论如何必须将完整的缓冲区发送到设备。你必须测试它,只是为了确定。
关于 3。:创建缓冲区后无法更改缓冲区的大小,但可以创建比实际需要的缓冲区更大的缓冲区。所以尽量估计一个好的边际。如果缓冲区仍然太小,则将创建一个新缓冲区。没有其他解决方案。您已经找到了可能的动态增加缓冲区大小的算法。
在图形性能方面有很多参数,几乎不可能给出明确的答案。你是否已经遇到限制?如果没有,不要打扰太多。在你还在发展的同时慷慨地利用你的资源。