在 DirectX11 中为动态和静态对象使用单独的顶点缓冲区
Using separate vertex buffer for dynamic and static objects in DirectX11
在 DirectX 11 应用程序中为静态和动态对象设置单独的顶点缓冲区有什么好处吗?我的方法是将一个场景中所有物体的顶点存储在同一个顶点缓冲区中。
但是,我只需要重新映射整个集合(最多 200 个对象)中的少量对象(1 到 5 个)。大多数对象是静态的,不会以任何方式进行转换。这样做的最佳方法是什么?
使用丢弃映射大顶点缓冲区会强制驱动程序在每一帧分配新内存。最多可以传输 4 帧,因此该缓冲区可以有 4 个副本。这可能导致内存过度使用和卡顿。例如,ATI 建议丢弃最大 4 mb (GCN Performance Tweets) 的顶点缓冲区。此外,每次您都必须将静态数据不必要地复制到新的顶点缓冲区。
没有覆盖的映射应该会更好。它需要手动管理内存,因此您不会覆盖正在运行的数据。我不确定对性能的影响,但可以肯定这不是推荐的路径。
最好的方法是通过提供尽可能多的提示来简化驾驶员的工作。使用不可变标志创建静态顶点缓冲区,使用默认标志长期存在,使用动态标志创建动态。请参阅供应商指南,例如 GCN Performance Tweets 或 不要全部丢弃:高效缓冲区管理 了解更多详细信息。
在 DirectX 11 应用程序中为静态和动态对象设置单独的顶点缓冲区有什么好处吗?我的方法是将一个场景中所有物体的顶点存储在同一个顶点缓冲区中。
但是,我只需要重新映射整个集合(最多 200 个对象)中的少量对象(1 到 5 个)。大多数对象是静态的,不会以任何方式进行转换。这样做的最佳方法是什么?
使用丢弃映射大顶点缓冲区会强制驱动程序在每一帧分配新内存。最多可以传输 4 帧,因此该缓冲区可以有 4 个副本。这可能导致内存过度使用和卡顿。例如,ATI 建议丢弃最大 4 mb (GCN Performance Tweets) 的顶点缓冲区。此外,每次您都必须将静态数据不必要地复制到新的顶点缓冲区。
没有覆盖的映射应该会更好。它需要手动管理内存,因此您不会覆盖正在运行的数据。我不确定对性能的影响,但可以肯定这不是推荐的路径。
最好的方法是通过提供尽可能多的提示来简化驾驶员的工作。使用不可变标志创建静态顶点缓冲区,使用默认标志长期存在,使用动态标志创建动态。请参阅供应商指南,例如 GCN Performance Tweets 或 不要全部丢弃:高效缓冲区管理 了解更多详细信息。