DX11更新共享纹理

时间:2017-05-15 15:30:37

标签: multithreading graphics directx directx-11

我有一个共享的DX11纹理,它在不同的线程中与2个不同的设备一起使用。

Thread1(在设备1上运行):每帧调用并更新共享纹理

Thread2(在device2上运行):通过将共享纹理复制到另一个纹理来消耗共享纹理。频率比线程1小得多。

根据MSDN“如果在一台设备上更新共享纹理,则必须在该设备上调用ID3D11DeviceContext :: Flush。”

然而,每一帧在thread1上调用flush是非常昂贵的,我们看到了巨大的性能损失。我们无法在线程2上刷新设备1,因为设备上下文不是线程安全的。

当线程2需要使用它时,有没有办法有效地进行共享纹理更新?

感谢您的帮助!在处理共享纹理时,MSDN不是很有用。 强调文字

1 个答案:

答案 0 :(得分:0)

为了在两个线程(或进程间)之间同步对共享资源的访问,您可以使用IDXGIKeyedMutex。这里详细介绍:https://msdn.microsoft.com/en-us/library/windows/desktop/ee913554(v=vs.85).aspx#dxgi_1.1_synchronized_shared_surfaces

您可以检查提供的示例代码,尽管它们仅显示两个DX10设备之间的资源共享。 DX11设备也是如此。 最重要的部分是首先查询IDXGIResource的共享纹理,然后是IDXGIKeyedMutex。之后,使用AcquireSync和ReleaseSync函数使用互斥锁进行同步。