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



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

谢谢。

依尔

Direct3D 11 多线程模型相当简单:

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

  • ID3D11DeviceContext11的调用不是线程安全的,并且一次只应从单个线程调用此接口上给定上下文的方法。

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

这意味着你应该有一个使用即时设备上下文(和 DXGI(的线程,并且这可能应该与主 Windows 消息泵相同(原因在 DirectX 图形基础结构 (DXGI(:最佳做法中介绍。

您可以使用直接上下文Map与使用直接上下文的线程相同的线程上,封送指向另一个线程的指针,然后在该线程完成时从原始线程Unmap它,但这极不可能提高性能。

请参阅 Direct3D 11 中的多线程处理简介

最新更新