我有一个共享的 DX11 纹理,用于不同线程中的 2 个不同设备。
Thread1(在设备 1 上操作(:调用每一帧并更新共享纹理
Thread2(在设备 2 上运行(:通过将共享纹理复制到另一个纹理来使用共享纹理。频率远低于线程 1。
根据MSDN"如果在一台设备上更新了共享纹理ID3D11DeviceContext::Flush必须在该设备上调用。
然而,在 thread1 上调用 flush 每一帧都非常昂贵,我们看到巨大的性能下降。我们无法在线程 2 上刷新设备 1,因为设备上下文不是线程安全的。
有没有办法在线程 2 需要使用共享纹理时有效地更新共享纹理?
感谢您的帮助!MSDN 在处理共享纹理时不是很有帮助。强调文本
为了在两个线程(或进程间(之间同步对共享资源的访问,您可以使用 IDXGIKeyedMutex。下面详细介绍了它:https://msdn.microsoft.com/en-us/library/windows/desktop/ee913554(v=vs.85(.aspx#dxgi_1.1_syncd_shared_surface
您也可以检查提供的示例代码,尽管它们仅显示两个DX10设备之间的资源共享。DX11 设备也是如此。本质部分是先为 IDXGIResource 查询共享纹理,然后再为 IDXGIKeyedMutex 提供共享纹理。之后,通过使用 AcquireSync 和 ReleaseSync 函数使用互斥锁进行同步。