【发布时间】:2014-06-05 09:37:55
【问题描述】:
我正在尝试创建一个简单的 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 实例。所以我的问题是:
- 创建多线程 Direct2D 应用程序的最佳实践是什么?
- 如果我使用的方法是正确的,我做错了什么以及如何解决?
任何帮助将不胜感激。
【问题讨论】:
-
所以没人知道答案吗?好吧,也许是一个提示或什么......((
标签: c++ windows multithreading direct2d