Direct2D中的多线程

Multithreading in Direct2D

本文关键字:多线程 Direct2D      更新时间:2023-10-16

我正在尝试创建一个简单的D2D游戏引擎(至少它必须能够在窗口中显示和移动图像),一切都很顺利,直到我决定切换到多线程版本。我读过MSDN的这篇文章,它建议使用多个线程中的一个多线程工厂。但本文声称拥有几个单线程工厂会更有效(尽管本文描述了服务器端渲染场景,但原理与我的情况相同,我错了吗?)。当我尝试使用一个线程一个工厂的方法时,所有的图像都被显示和移动,但有可怕的闪烁。在我的WM_PAINT处理程序中,我正在尝试做这样的事情:

for (CSingleThreadEngine *pElSingleThreadEngine : m_SingleThreadEngines) //each CSingleThreadEngine instance has its own D2D factory and an image collection
    pElSingleThreadEngine->Draw();

pElSingleThreadEngine->Draw()绘制如下:

m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
for (CGameImage *pImage : m_GameImages)
{
    if (FAILED(pImage->Draw()))
        throw runtime_error("An object cannot be drawn");
}
m_pRenderTarget->EndDraw();

我认为这里的错误是在一个窗口中有几个ID2D1HowndRenderTarget实例,因为如果我在一个单独的窗口中绘制每个线程,它就可以正常工作。但我只想在一个窗口中绘制,并且我无法避免为此使用多个ID2D1HowndRenderTarget实例。所以我的问题是:

  1. 创建多线程Direct2D应用程序的最佳实践是什么
  2. 如果我使用的方法是正确的,我做错了什么?我该如何解决

如有任何帮助,我们将不胜感激。

我看不出为什么在一个窗口中使用多个HWND渲染目标。您是否尝试过为每个线程创建屏幕外位图,并将其绘制到单个HWND渲染目标?