在DirectX11中为动态和静态对象使用单独的顶点缓冲区

时间:2015-07-11 15:04:59

标签: c++ buffer directx-11 vertex-buffer

在DirectX 11应用程序中为静态和动态对象分别使用顶点缓冲区有什么好处吗?我的方法是让场景中所有对象的顶点存储在同一个顶点缓冲区中。

但是,我只需要重新映射整个集合中的少量对象(1到5)(最多200个对象)。大多数对象都是静态的,不会以任何方式进行转换。这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

使用discard映射大顶点缓冲区会强制驱动程序每帧分配新内存。最多可以飞行约4帧,因此可以有4个副本的缓冲区。这可能导致内存过度使用和口吃。例如,ATI建议丢弃最大4 mb(GCN Performance Tweets)的顶点缓冲区。此外,每次您必须不必要地将静态数据复制到新的顶点缓冲区。

没有覆盖的映射应该更好。它需要手动管理内存,因此您不会覆盖正在传输的数据。我不确定性能影响,但肯定这不是推荐路径。

最好的方法是通过提供尽可能多的提示来简化驱动程序的工作。使用不可变标志创建静态顶点缓冲区,使用默认标志长期使用,使用动态标志创建动态。有关其他详细信息,请参阅GCN Performance TweetsDon’t Throw it all Away: Efficient Buffer Management等供应商指南。