Direct2D中的多线程

时间:2014-04-21 10:21:15

标签: c++ windows multithreading direct2d

我试图创建一个简单的D2D游戏引擎(它必须能够在窗口中显示和移动图像,至少),一切都正常,直到我决定切换到多线程版本的那一刻。我阅读了this MSDN文章,它建议使用多个线程中的一个多线程工厂。但是this文章声称拥有几个单线程工厂会更有效(虽然文章描述了服务器端渲染场景,但我的情况原理是一样的,我错了吗?)。当我尝试使用单线程单工厂方法时,所有图像都会被显示和移动,但是会出现可怕的闪烁现象。在我的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();

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

  1. 创建多线程Direct2D应用程序的最佳做法是什么?
  2. 如果我使用的方法是正确的,我做错了什么以及如何解决?
  3. 任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我看不出为什么在单个窗口中使用多个HWND渲染目标的原因。您是否尝试为每个线程创建offscrean位图并将其绘制到单个hwnd渲染目标中?