我试图创建一个简单的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实例。所以我的问题是:
任何帮助都将受到高度赞赏。
答案 0 :(得分:0)
我看不出为什么在单个窗口中使用多个HWND渲染目标的原因。您是否尝试为每个线程创建offscrean位图并将其绘制到单个hwnd渲染目标中?