我正在尝试创建一个简单的 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 应用程序的最佳实践是什么?
- 如果我使用的方法是正确的,那么我哪里做错了,我该如何改正?
如有任何帮助,我们将不胜感激。
最佳答案
我看不出为什么要为单个窗口使用多个 HWND 渲染目标。您是否尝试过为每个线程创建屏幕外位图并将它们绘制到单个 HWND 渲染目标?
关于c++ - Direct2D 中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23195425/