在C++中使用多线程绘制多边形
Drawing polygons using multithreading in C++
我正在使用C++在事件中使用WM_PAINT绘制多边形(多边形(dc,点,3((。我有大量的多边形,所以我正在尝试实现多线程。我正在运行VS2013,所以我包含了线程。我创建了一个要在线程上运行的函数:
void anyFunс2(HDC dc, int index)
{
POINT points[3];
for (unsigned i = index; i < model->vertexFaces.size(); i += fs)
{
// Here we convert our points to Clip and Windowed Coordinates
// and only then fetch the results
if (Algorithms::FetchPolygons(&model->finalizedVertices[0], model->vertexFaces[i], points))
{
Polygon(dc, points, 3);
}
}
}
例如,我有三个线程。我按照每个线程呈现每个第三个元素的方式设计了代码。例如,第一个线程渲染 0,3,6,9 个多边形,第二个线程渲染 1,4,7,10,最后一个线程渲染 2,5,8,11 个多边形。
这是我WM_PAINT事件:
case WM_PAINT:
{
// Get dc here
hdc = GetDC(hWnd);
// Create a backbuffer here
bdc = CreateCompatibleDC(hdc);
// Get the screen dimensions
RECT client;
GetClientRect(hWnd, &client);
// Create bitmap
HBITMAP backBuffer = CreateCompatibleBitmap(hdc, client.right - client.left, client.bottom - client.top);
// Release it, because we no longer need it
hdc = NULL;
ReleaseDC(hWnd, hdc);
// Select the back dc as a current one and specify the screen dimensions
HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0, 25, 205));
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 55));
SelectObject(bdc, hPen);
SelectObject(bdc, hBrush);
SelectObject(bdc, backBuffer);
Rectangle(bdc, client.left, client.top, client.right, client.bottom);
// Call some threads to draw polygons on our BDC
for (unsigned i = 0; i < func_threads.size(); i++)
{
func_threads.at(i) = thread(anyFunс2, bdc, i);
}
// Wait until all threads finish their job
for (unsigned i = 0; i < func_threads.size(); i++)
{
if (func_threads[i].joinable()) func_threads[i].join();
}
// Swap buffers
hdc = BeginPaint(hWnd, &ps);
BitBlt(hdc, client.left, client.top, client.right, client.bottom, bdc, 0, 0, SRCCOPY);
EndPaint(hWnd, &ps);
// Delete all created objects from memory
DeleteObject(backBuffer);
DeleteObject(hBrush);
DeleteObject(hPen);
DeleteDC(bdc);
break;
}
如您所见,我在循环中运行这些线程。然后我有另一个循环,其中每个线程的 Join(( 方法都位于其中。这些线程将多边形绘制到相同的 HDC(我假设(。在主线程完成等待所有这些线程后,它会将所有内容从后台缓冲区复制到主缓冲区。但是,问题是对象没有完全绘制。我的意思是并非所有多边形都被绘制出来。图像的链接附在此处。请帮帮我,为什么会这样?!
简短的回答是,GDI 根本不设计为支持同时从多个线程绘制到同一 DC 中。
这给你留下了一些选择。最直接的是使用多边形在一次调用中绘制所有多边形(或至少大量多边形(。这似乎与你的情况特别相关 - 从外观上看,你画了很多三角形,所以很多时间可能只是调用Polygon
函数的开销,而不是执行Polygon
的时间。
另一种可能性是为每个要绘制的线程创建一个单独的后台缓冲区,然后使用 BitBlit 将它们与(例如(OR 函数组合在一起,以便获得与原始绘图相同的整体效果。
支持绘制大量多边形的第三种(也可能是最好的(方法是从使用 GDI 切换到使用 DirectX 或 OpenGL 之类的
您可以使用 CreateDIBsection(( 绘制具有多个线程的形状。只需让每个线程将像素直接绘制到 DIB。然后,当所有线程都完成后,您可以将DIB位到屏幕上。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 在C++中使用多线程绘制多边形