Optimization 动态或静态顶点缓冲区(如果我没有';我不知道确切的用法?

Optimization 动态或静态顶点缓冲区(如果我没有';我不知道确切的用法?,optimization,directx,game-engine,directx-11,vertex-buffer,Optimization,Directx,Game Engine,Directx 11,Vertex Buffer,在基于DirectX 11的引擎中,我有一个网格类(显然)有一个顶点和一个索引缓冲区 “我的引擎”的用户可以在运行时更改网格顶点(例如,设置单个或多个顶点的位置/颜色等) 网格还可以从模型加载动画,然后由用户运行 现在我不知道应该使用动态还是静态顶点缓冲区 如果网格有动画,我当然应该使用动态顶点缓冲区。但是,如果用户从未尝试运行动画,并且顶点保持不变(例如,一个简单角色长时间处于空闲状态),该怎么办 用户可能(但不会)一直更改顶点(例如,小行星雨撞击地板而变形),可能是每一帧。在这里,每次重

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

  • “我的引擎”的用户可以在运行时更改网格顶点(例如,设置单个或多个顶点的位置/颜色等)
  • 网格还可以从模型加载动画,然后由用户运行
现在我不知道应该使用动态还是静态顶点缓冲区

  • 如果网格有动画,我当然应该使用动态顶点缓冲区。但是,如果用户从未尝试运行动画,并且顶点保持不变(例如,一个简单角色长时间处于空闲状态),该怎么办
  • 用户可能(但不会)一直更改顶点(例如,小行星雨撞击地板而变形),可能是每一帧。在这里,每次重新绑定静态缓冲区都不是一个好主意
  • 我应该始终使用动态缓冲区吗?我是否应该始终使用静态缓冲区并在每一帧重新绑定它

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


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

    角色动画通常是通过蒙皮/骨骼动画来完成的,它不需要更新每个帧的顶点,只需要更新每个模型的骨骼矩阵。每个顶点属性通常受几个静态定义了某些权重(每个顶点最多4个骨骼)的骨骼的影响

    有时您还需要按程序生成一些顶点,或者从CPU为它们设置动画,因为GPU上的代码可能太复杂,因此在这种情况下,您需要使用动态顶点缓冲区


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

    如果顶点数量及其通过索引的关系没有改变(即网格是“静态的”),则最好在着色器中处理变形。这对于动画网格可能是有保证的。但是,如果用户手动创建网格,添加新顶点和删除现有顶点将是一项常见任务。如果我理解正确,我将使用静态缓冲区-当网格播放动画时,这些动画无论如何都是通过矩阵实现的,顶点着色器处理这些,如果用户手动创建网格并添加顶点(很有可能不会每帧更新一次),更新静态缓冲区是可以的。