动态或静态顶点缓冲区,如果我不知道明确的用法?

时间:2014-04-18 09:20:20

标签: optimization directx game-engine directx-11 vertex-buffer

在我的基于DirectX 11的引擎中,我有一个Mesh类(显然)有一个顶点和一个索引缓冲区。

  • 我的引擎用户可以在运行时更改网格顶点(例如,设置单个或多个顶点的位置/颜色等)。
  • 网格也可以从模型加载动画,然后由用户运行。

现在我不知道我是否应该使用动态或静态顶点缓冲区。

  1. 如果网格有动画,我当然应该使用动态顶点缓冲区。但是如果用户从不倾向于运行动画并且顶点保持不变(例如,长时间处于空闲状态的简单字符)会怎么样?
  2. 用户可能(但不会)一直改变顶点(例如小行星雨撞击地板变形),可能是每一帧。每次重新绑定静态缓冲区在这里都是个坏主意。
  3. 我应该总是使用动态缓冲区吗?我应该总是使用静态缓冲区并每帧重新绑定它吗?

    或者我应该自动检测使用情况并在网格每次更新/空闲后切换到动态/静态特定数量的帧(让我们说~120帧)?这意味着更多的开发(检测这种行为,然后更改缓冲区),这是一个好主意吗?

    我不想让引擎用户面对两个不同的类(因此他最终必须决定使用静态/动态缓冲区)。它应该是我的引擎的一部分来处理这个。

1 个答案:

答案 0 :(得分:1)

角色动画通常使用蒙皮/骨骼动画完成,不需要更新每个帧的顶点,只需更新每个模型的骨骼矩阵。每个顶点属性通常受到一些骨骼的影响,这些骨骼具有静态定义的一些权重(通常每个顶点最多4个骨骼)。

有时你还需要在程序上生成一些顶点,或者从CPU动画它们,因为GPU上的代码可能过于复杂,所以在这种情况下你需要使用动态顶点缓冲区。

在这两种情况下,不可能提前(静态地)知道动画的行为,也不应该遇到必须在它们之间切换的情况。虽然对于动态顶点缓冲区,但是当您不想制作动画时,可以避免更新缓冲区。在可能需要动画的情况下,仅使用动态缓冲区可能很诱人,但实际上这些对于GPU在最坏情况下(动态)初始化顶点缓冲区是不利的,因此推荐的方法是优先选择具有动画的静态场景尽可能使用GPU,并且只在特殊情况下使用动态缓冲区