关于Direct2D绘图调用中的多线程

时间:2014-06-26 12:00:21

标签: c++ multithreading directx direct2d

序言

好吧......我知道这个问题可能涉及几个主题,但我对DirectX以及多线程和我直到现在读到的Stackoverflow + MSDN文章都完全没有帮助。因此,我非常感谢每个评论推动我朝着正确的方向发展。

前提

我几个星期前开始编写一个Direct2D渲染器,它绘制了一些我放入其中的矩阵并将其绘制在一个窗口中(顺便说一下,这很好用)。

我试图加快计算速度并获得使用openMP的提示。当使用pragma语句时,我的progrman使用3个线程而不是一个 - 我猜这很好。但我没有注意到任何加速。然而,这不是最突出的部分。绘图调用占用很多的时间比我对矩阵的计算要多。我不知道如何加快速度。

问题

请告诉我应该注意什么或如何加快/多线程我的绘图电话。

注意:我使用的是STL,Windows和DirectX标题,但没有 .NET,MFC / ATL或类似的库。

代码示例

vector<dot> set computeMatrix(ushort x, ushort y)
{
   // init set
   #pragma omp parallel for
   for(i=0; i<y; ++i)
     for(j=0; j<x; ++j)
        //do some computation
   return set;
}

dot是D2D1椭圆对象。

void draw(vector<dot> set)
{
  pRenderTarget->BeginDraw();
  pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
  #pragma omp parallel for
  for(auto coord: set)
  {
    // set the pBrush
    pRenderTarget->FillEllipse(dot, pBrush);
  }
  pRenderTarget->EndDraw();
}

1 个答案:

答案 0 :(得分:3)

如果您使用的是Win8或更高版本,请确保在创建Direct2D设备上下文时设置了D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTITHREADED_OPTIMIZATIONS选项。

  

指定此标志后,Direct2D将分配渲染   系统上存在的所有逻辑核心都可以   显着缩短整体渲染时间。

目前,此标志仅适用于几何体,并且需要HAL。

  

从Windows 8.1开始,此标志仅影响路径几何渲染。它   对仅包含其他原始类型的场景没有影响(例如   文本,位图或几何实现)。

     

该标志在软件中渲染时也没有影响(即何时   使用WARP Direct3D设备进行渲染)。控制软件   多线程,来电者应该使用   D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS标志何时   创建WARP Direct3D设备。

     

指定此标志可以在渲染期间增加峰值工作集   并且还可以增加已经应用程序中的线程争用   利用多线程处理。

您可能还想考虑geometry realizations。当有大量的几何对象要渲染时,我发现这会产生明显的差异,但是你必须为你的场景分析它。椭圆是一个简单的几何体,因此您可能看不到明显的增益,特别是如果您必须转换为渲染位置。

OpenMP(或任何其他GPU api)可以在简单任务上提供更差的性能,因为必须创建一个视图&#39;并从视图中复制数据。确保您使用OpenMP使特定任务受益,并确保您的分析包括上述步骤。

请记住,线程的创建和调度会产生大量开销。通常,通过尽可能简化代码并且不处理调度和同步,您将看到更好的性能。然而,精心策划的线程可以带来巨大的收益,特别是当他们不操纵相同的资源(或数据)时。

看看你的渲染过程,并尝试确定你的代码是否必须重新计算任何没有改变的东西(大小,位置等)。响应窗口大小更改时执行这些任务。注意结构对齐(内存边界)和数据的位置(缓存未命中是昂贵的)。希望这会有所帮助。