c++ - Direct2D 中的多线程

标签 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. 如果我使用的方法是正确的,那么我哪里做错了,我该如何改正?

如有任何帮助,我们将不胜感激。

最佳答案

我看不出为什么要为单个窗口使用多个 HWND 渲染目标。您是否尝试过为每个线程创建屏幕外位图并将它们绘制到单个 HWND 渲染目标?

关于c++ - Direct2D 中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23195425/

相关文章:

c++ - CMake + 库达 : compile cpp files in Cuda-mode (--x=cu)

c++ - 通过管道发送回车按钮输入

c++ - 如何查看导致转储的故障发生在哪毫秒?

c - x86 - 获取方向标志 (DF) 的当前状态

c++ - 如何使用C++测量Mac OS上多线程程序的时间成本?

c++ - 如何在 for 循环中记录输入?

c++ - 使用 LLVM IR 实现动态类型语言

c++ vector of vectors 销毁

c++ - 如何从未创建该窗口的线程更新窗口?

java - Platform.runLater,处理大量任务太慢