我正在尝试创建一个简单的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实例。所以我的问题是:
任何帮助将不胜感激。
我看不到为什么在单个窗口中使用多个HWND渲染目标的原因。您是否尝试过为每个线程创建屏幕外的位图并将它们绘制到单个HWND渲染目标上?