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

About multithreading in a Direct2D drawing call

本文关键字:多线程 调用 Direct2D 图形 关于      更新时间:2023-10-16

序言

好吧。。。我知道这个问题可能涉及几个主题,但我对DirectX以及多线程技术完全陌生,直到现在我读到的Stackoverflow+MSDN文章对我没有任何帮助。因此,我非常感谢的每一条评论,它们将我推向了正确的方向。

前提

几周前,我开始编写一个Direct2D渲染器,它绘制了我放入其中的一些矩阵,并在一个窗口中绘制(顺便说一句,效果很好(。

我试图加快我的计算速度,得到了使用openMP的提示。在使用pragma语句时,我的progman使用了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;
}

CCD_ 3是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();
}

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

指定此标志后,Direct2D将在系统上存在的所有逻辑核心,可以显著减少了整体渲染时间。

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

从Windows 8.1开始,此标志仅影响路径几何体渲染。它对仅包含其他基元类型(例如文本、位图或几何体实现(。

在软件中渲染时(即使用WARP Direct3D设备进行渲染(。控制软件多线程,调用方应使用当创建WARP Direct3D设备。

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

您可能还需要考虑几何体的实现。我发现,当有大量几何体对象要渲染时,这会产生明显的差异,但您必须为您的场景对其进行配置。椭圆是一个简单的几何体,因此您可能看不到明显的增益,尤其是当您必须平移到渲染位置时。

OpenMP(或任何其他GPU api(在简单任务上的性能可能会差得多,因为必须创建"视图"并将数据复制到视图中或从视图中复制数据。确保您的特定任务从使用OpenMP中受益,并确保您的评测包括上述步骤。

请记住,创建和调度线程会产生大量开销。通常,通过使代码尽可能简单,而不处理调度和同步,您会看到更好的性能。尽管如此,精心规划的线程可以提供巨大的收益,尤其是当它们不操作相同的资源(或数据(时。

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