DirectX 顶点缓冲区默认与默认 + 暂存
DirectX vertex buffer Default vs Default + Staging
我正在寻找这两者在 GPU 读取速度和偶尔 CPU 写入方面的区别(每帧少于一次,甚至只有一次)。我不想使用 D3D11_USAGE_DYNAMIC
因为数据不会更新 >= 每帧一次。
在 Default
缓冲区上使用 Default + Staging
组合是否有显着的性能提升?
此处Direct3D 11 的最佳性能建议实际上与Direct3D 10.0 相同。首先回顾一下来自 Gamefest 2007 的演讲 Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games。
对于您的问题,对资源(纹理或缓冲区)的任何更新都会产生一些潜在的性能影响,但是对于 'occasional' 更新,最好的选择是使用 STAGING 资源,然后 CopyResource
到实际渲染的默认资源。
DYNAMIC
纹理应该保留用于非常频繁的更新(比如视频纹理播放),当然还有进行动态绘制提交时的顶点缓冲区。常量缓冲区实际上是 DYNAMIC
或使用 UpdateSubresource
,这实际上取决于您的更新模式(上面讨论的主题)。
只要有可能,将资源创建为 IMMUTABLE
并使用 pInitialData 是 DirectX 11 的最佳选择,因为它可能允许驱动程序有机会更高效地创建多线程资源。
使用此模式需要注意的主要事情是 STAGING 资源会导致虚拟内存碎片,这对于 32 位 (X86) 应用程序来说可能是个问题,因此您应该尝试使用它们而不是创建他们中的很多人或摧毁他们并重新创造他们。请参阅附加到此 blog post 的谈话 "Why Your Windows Game Won't Run In 2,147,352,576 Bytes"。
我建议您的初始版本是尝试使用 DEAFAULT+UpdateSubresource
,然后将其与 DEAULT+STAGING+CopyResource
解决方案进行比较,因为它在很大程度上取决于您的内容和代码。
我正在寻找这两者在 GPU 读取速度和偶尔 CPU 写入方面的区别(每帧少于一次,甚至只有一次)。我不想使用 D3D11_USAGE_DYNAMIC
因为数据不会更新 >= 每帧一次。
在 Default
缓冲区上使用 Default + Staging
组合是否有显着的性能提升?
此处Direct3D 11 的最佳性能建议实际上与Direct3D 10.0 相同。首先回顾一下来自 Gamefest 2007 的演讲 Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games。
对于您的问题,对资源(纹理或缓冲区)的任何更新都会产生一些潜在的性能影响,但是对于 'occasional' 更新,最好的选择是使用 STAGING 资源,然后 CopyResource
到实际渲染的默认资源。
DYNAMIC
纹理应该保留用于非常频繁的更新(比如视频纹理播放),当然还有进行动态绘制提交时的顶点缓冲区。常量缓冲区实际上是 DYNAMIC
或使用 UpdateSubresource
,这实际上取决于您的更新模式(上面讨论的主题)。
只要有可能,将资源创建为 IMMUTABLE
并使用 pInitialData 是 DirectX 11 的最佳选择,因为它可能允许驱动程序有机会更高效地创建多线程资源。
使用此模式需要注意的主要事情是 STAGING 资源会导致虚拟内存碎片,这对于 32 位 (X86) 应用程序来说可能是个问题,因此您应该尝试使用它们而不是创建他们中的很多人或摧毁他们并重新创造他们。请参阅附加到此 blog post 的谈话 "Why Your Windows Game Won't Run In 2,147,352,576 Bytes"。
我建议您的初始版本是尝试使用 DEAFAULT+UpdateSubresource
,然后将其与 DEAULT+STAGING+CopyResource
解决方案进行比较,因为它在很大程度上取决于您的内容和代码。