使用 DirectX11 在非 UI 线程中更新顶点缓冲区
Update vertex buffer in non UI thread using DirectX11
我想用动态顶点缓冲区渲染一个对象,我在 UI 线程中进行渲染。我在想是否可以使用 Map 和 Unmap 在非 UI 线程中更改此顶点缓冲区内容。
谢谢。
YL
Direct3D 11 多线程模型相当简单:
对 ID3D11Device
的调用是线程安全的(除非您在创建设备时使用了 D3D11_CREATE_DEVICE_SINGLETHREADED
标志)。您可以从任何线程调用此接口上的方法。
对 ID3D11DeviceContext11
的调用 不是 线程安全的,您应该只从一个给定的上下文调用此接口上的方法一个线程。
这就是为什么 Map
和 Unmap
是 ID3D11DeviceContext11
的一部分而不是 ID3D11Device
或 ID3D11Resource
本身的原因,就像在 Direct3D 10 中一样. 该操作本质上与其他操作是串行的。
这意味着您应该有一个使用直接设备上下文(和 DXGI)的线程,并且这可能应该与主 windows 消息泵相同的线程(原因在 DirectX Graphics Infrastructure (DXGI): Best Practices.
您可以 Map
在与使用即时上下文的线程相同的线程上,将指针编组到另一个线程,然后在该线程完成时从原始线程 Unmap
它,但这是不太可能提高性能。
我想用动态顶点缓冲区渲染一个对象,我在 UI 线程中进行渲染。我在想是否可以使用 Map 和 Unmap 在非 UI 线程中更改此顶点缓冲区内容。
谢谢。
YL
Direct3D 11 多线程模型相当简单:
对
ID3D11Device
的调用是线程安全的(除非您在创建设备时使用了D3D11_CREATE_DEVICE_SINGLETHREADED
标志)。您可以从任何线程调用此接口上的方法。对
ID3D11DeviceContext11
的调用 不是 线程安全的,您应该只从一个给定的上下文调用此接口上的方法一个线程。
这就是为什么 Map
和 Unmap
是 ID3D11DeviceContext11
的一部分而不是 ID3D11Device
或 ID3D11Resource
本身的原因,就像在 Direct3D 10 中一样. 该操作本质上与其他操作是串行的。
这意味着您应该有一个使用直接设备上下文(和 DXGI)的线程,并且这可能应该与主 windows 消息泵相同的线程(原因在 DirectX Graphics Infrastructure (DXGI): Best Practices.
您可以 Map
在与使用即时上下文的线程相同的线程上,将指针编组到另一个线程,然后在该线程完成时从原始线程 Unmap
它,但这是不太可能提高性能。