Direct2D 和 DXGI(D3D 互操作)多线程的最佳实践是什么?

2024-02-24

理想情况下,我希望有多个工作线程能够渲染到屏幕外渲染目标,然后将渲染的内容“传输”到屏幕上目标。对于 hwnd 渲染目标,这似乎不是问题(msdn 有一个例子)。

当屏幕渲染目标基于 DXGI 交换链时,我不太确定该怎么做。据我所知,每个窗口只能有一个交换链。因此我只能有一个基于交换链的渲染目标。这意味着屏幕渲染只能通过该单个渲染目标完成。

如果我的上述假设是正确的,那么处理多线程渲染的最佳方法是什么?我是否需要序列化对屏幕目标的访问?工作线程是否应该共享单个多线程 d2d 工厂?如果有适当的锁定机制,屏幕目标的 BeginDraw/EndDraw/Present 是否可以在工作线程(即未创建屏幕目标的线程)上执行?

我将不胜感激any建议。 谢谢。


我现在正在解决同样的问题!根据我在MSDN上的阅读,最好的方法是:

  • 使用多线程工厂 -这可以让您共享资源 http://blogs.msdn.com/b/directx/archive/2009/09/11/using-direct2d-for-server-side-rendering.aspx(另请参阅下面引用的链接)。
  • 小心一些死锁情况(详细信息如下。)
  • 你可能需要使用ID2D1多线程 http://msdn.microsoft.com/en-us/library/windows/desktop/hh997714%28v=vs.85%29.aspx使用 Direct3D 绘图时锁定。

我还没有得到可靠工作的 Direct2D 多线程函数集,即使遵循此,所以这就是我到目前为止所知道的一切 - 我还不知道肯定存在的其他警告等。

一些有用的关键位:

您可以创建多线程 Direct2D 工厂实例。您可以使用 并共享一个多线程工厂及其所有资源 不是一个线程,但可以访问这些资源(通过 Direct2D 调用) 由 Direct2D 序列化,因此不会发生访问冲突。如果你的应用程序 仅调用 Direct2D API,此类保护由以下自动完成 以最小的开销实现粒度级别的 Direct2D。

ID2D1Factory* m_D2DFactory;

// Create a Direct2D factory.
HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_MULTI_THREADED,
    &m_D2DFactory
);
  • Source http://msdn.microsoft.com/en-us/library/windows/desktop/jj569217%28v=vs.85%29.aspx.

还有一个非常重要的警告:

多线程注意事项

当您在应用程序中使用 DXGI 时 多线程,你需要小心避免造成死锁, 其中两个不同的线程正在等待对方完成。 有两种情况可能会发生这种情况。

  • 渲染线程是 不是消息泵线程。
  • 执行 DXGI API 的线程不是 创建窗口的同一线程。

小心你永远不会 当您使用时,让消息泵线程在渲染线程上等待 全屏交换链。例如,调用 IDXGISwapChain1::Present1(来自渲染线程)可能会导致 渲染线程等待消息泵线程。当模式改变时 发生时,如果 Present1 调用 ::SetWindowPos(),则可能出现这种情况 或 ::SetWindowStyle() 并且这些方法中的任何一个调用 ::发信息()。在这种情况下,如果消息泵线程有一个 临界区保护它或者如果渲染线程被阻塞,那么 两个线程将会死锁。

  • Source http://msdn.microsoft.com/en-us/library/windows/desktop/bb205075%28v=vs.85%29.aspx#Multithread_Considerations.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Direct2D 和 DXGI(D3D 互操作)多线程的最佳实践是什么? 的相关文章

随机推荐