使用DirectX11更新非UI线程中的顶点缓冲区

时间:2017-07-12 01:44:56

标签: directx-11

我想渲染一个带有动态顶点缓冲区的对象,并且我在UI线程中进行渲染。我想可以使用Map和Unmap在非UI线程中更改此顶点缓冲区内容。

感谢。

YL

1 个答案:

答案 0 :(得分:0)

Direct3D 11多线程模型非常简单:

  • ID3D11Device的调用是线程安全的(除非您在创建设备时使用了D3D11_CREATE_DEVICE_SINGLETHREADED标志)。您可以从任何线程调用此接口上的方法。

  • ID3D11DeviceContext11的调用是线程安全的,并且您应该只在一个线程上为一个给定的上下文调用此接口上的方法。

这就是为什么MapUnmapID3D11DeviceContext11而不是ID3D11DeviceID3D11Resource本身的一部分,就像它在Direct3D 10中一样。操作与其他操作本质上是串行的。

这意味着您应该使用单个线程使用直接设备上下文(和DXGI),这可能与您的主要Windows消息泵的线程相同(出于DirectX Graphics Infrastructure (DXGI): Best Practices中所述的原因。

你可以Map在与使用立即上下文的线程相同的线程上,将指针编组到另一个线程,然后在该线程完成时从原始线程Unmap,但这不太可能提高绩效。

请参阅Introduction to Multithreading in Direct3D 11