我想使用动态顶点缓冲区渲染一个对象,并在 UI 线程中进行渲染。我在想是否可以使用 Map 和 Unmap 在非 UI 线程中更改此顶点缓冲区内容。
谢谢。
依尔
Direct3D 11 多线程模型相当简单:
-
对
ID3D11Device
的调用是线程安全的(除非在创建设备时使用了D3D11_CREATE_DEVICE_SINGLETHREADED
标志(。可以从任何线程调用此接口上的方法。 -
对
ID3D11DeviceContext11
的调用不是线程安全的,并且一次只应从单个线程调用此接口上给定上下文的方法。
这就是为什么Map
和Unmap
是ID3D11DeviceContext11
的一部分,而不是像 Direct3D 10 中那样ID3D11Device
或ID3D11Resource
本身。该操作本质上与其他操作是串行的。
这意味着你应该有一个使用即时设备上下文(和 DXGI(的线程,并且这可能应该与主 Windows 消息泵相同(原因在 DirectX 图形基础结构 (DXGI(:最佳做法中介绍。
您可以使用直接上下文Map
与使用直接上下文的线程相同的线程上,封送指向另一个线程的指针,然后在该线程完成时从原始线程Unmap
它,但这极不可能提高性能。
请参阅 Direct3D 11 中的多线程处理简介