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

Posted

技术标签:

【中文标题】使用 DirectX11 更新非 UI 线程中的顶点缓冲区【英文标题】:Update vertex buffer in non UI thread using DirectX11 【发布时间】:2017-07-12 01:44:55 【问题描述】:

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

谢谢。

YL

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于使用 DirectX11 更新非 UI 线程中的顶点缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

非UI线程可不可以更新UI

非UI线程可不可以更新UI

非UI线程可不可以更新UI

DirectX 12和DirectX 11选哪个,有什么区别

DirectX* 11 多线程渲染的性能方法和实践

DirectX11 非实体线框