关于Direct2D图形调用中的多线程
About multithreading in a Direct2D drawing call
序言
好吧。。。我知道这个问题可能涉及几个主题,但我对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中受益,并确保您的评测包括上述步骤。
请记住,创建和调度线程会产生大量开销。通常,通过使代码尽可能简单,而不处理调度和同步,您会看到更好的性能。尽管如此,精心规划的线程可以提供巨大的收益,尤其是当它们不操作相同的资源(或数据(时。
查看渲染过程,并尝试确定是否有任何代码必须重新计算任何未更改的内容(大小、位置等(。在响应窗口大小更改时执行这些任务。请注意您的结构对齐(内存边界(和数据的位置(缓存未命中是昂贵的(。希望这能有所帮助。
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- 从多个线程调用 std::shuffle
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- gdb:在多线程程序中调用函数,不进行线程
- 优雅断言函数不是从多个线程调用的
- C 多线程JAVA JNI方法调用
- 从C 中的多个线程调用Python函数
- 从C API对python的多线程调用
- C++多线程在函数调用期间避免交错
- TBB C++多线程错误:没有匹配的调用函数
- 在多线程中调用带有输入参数的函数
- 当不调用thread.join()时,C 多线程异常
- 多线程:何时调用互斥锁
- 无法弄清楚将多个对象函数作为单独的线程调用的语法
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- 优化VS2010 c++(多线程)中的方法调用
- c++多线程:递归调用terminate
- XSetWMProtocols 和 glXCreateContext 在多线程环境中调用顺序
- c++多线程调用函数问题