如何使用多个CPU线程或GPU卡提高多个vtkRenderer对象在CPP中的VTK程序的渲染速度?

时间:2017-10-28 01:58:32

标签: vtk parallels

最近,我正在开发一个实时CPP程序,同时使用VTK显示体积渲染图像和其他一些多边形几何体。在我的代码中,4个vtkRenderer对象被实例化为包含不同种类的vtkProp对象,其方式如下:

auto renderer1 = vtkSmartPointer<vtkRenderer>::New();
auto renderer2 = vtkSmartPointer<vtkRenderer>::New();
auto renderer3 = vtkSmartPointer<vtkRenderer>::New();
auto renderer4 = vtkSmartPointer<vtkRenderer>::New();

auto vtkActor1 = vtkSmartPointer<vtkActor>::New();
auto vtkActor2 = vtkSmartPointer<vtkActor>::New();
auto vtkActor3 = vtkSmartPointer<vtkActor>::New();
auto vtkVolume4 = vtkSmartPointer<vtkVolume>::New();

renderer1->AddActor(vtkActor1);
renderer2->AddActor(vtkActor2);
renderer3->AddActor(vtkActor3);
renderer4->AddVolume(vtkVolume4);

auto window1 = vtkSmartPointer<vtkRenderWindow>::New();
auto window2 = vtkSmartPointer<vtkRenderWindow>::New();
auto window3 = vtkSmartPointer<vtkRenderWindow>::New();
auto window4 = vtkSmartPointer<vtkRenderWindow>::New();
window1->AddRenderer(renderer1);
window2->AddRenderer(renderer2);
window3->AddRenderer(renderer3);
window4->AddRenderer(renderer4);
随着时间的推移,创建了4个QTWidget计时器来渲染这些窗口。令人非常失望的是,带有Intel CORE I9 CPU和2 Nvidia GTX 1080 TI(在SlI模式下)的工作站中的程序速度与包含Intel CORE I5和Nvidia GeForce 940mx的笔记本电脑几乎没有差别。 .. window1到window3的渲染在某种程度上被window4中的光线投射计算所阻挡。另一方面,一旦禁用光线投射渲染的窗口4,将克服window1到window3的阻塞问题。     提高渲染速度并充分利用I9 CPU和双GTX 1080 TI的优势。此时,4 std :: thread用于尝试以不同的方式呈现这些不同的窗口:

auto thread1 = new std::thread([&]()
{
    while (1)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
        window1->Render();
    }
});
thread1->detach();
auto thread2 = new std::thread([&]()
{
    while (1)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
        window2->Render();
    }
});
thread2->detach();
auto thread3 = new std::thread([&]()
{
    while (1)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
        window3->Render();
    }
});
thread3->detach();
auto thread4 = new std::thread([&]()
{
    while (1)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
        window4->Render();
    }
});
thread4->detach();

这样看起来window1到window3的阻塞问题就消失了。不幸的是,一旦将鼠标操作应用到任何窗口,vtk运行时错误: “错误:在D:\ vtk7 \ VTK-7.1.1 \ Rendering \ OpenGL \ vtkWin32OpenGLRenderWindow.cxx,第278行 vtkWin32OpenGLRenderWindow(000002663199C870):makeCurrent()中的wglMakeCurrent失败,错误:“ 将生成,程序将在随机时间后崩溃。

此时我对如何在不同的CPU线程上安全地呈现不同的渲染窗口感到困惑。另一种解决方案我想可能是window4光线投射渲染应用于一个Nvidia GTX 1080 TI,window1到window3(没有光线投射)渲染都应用于另一个Nvidia GTX 1080 TI。 VTK是否支持我上面描述的工作模式?怎么做到了?

1 个答案:

答案 0 :(得分:0)

您无法从主线程外部(事件调度发生的线程)与VTK GUI类(如vtkRenderWindow)进行交互。当你这样做时会发生各种错误。

另外,我从未见过任何使用GPU渲染HWND组件而其他人使用其他程序的程序,据我所知,程序启动时可以设置GPU,就像那些带有GPU的那些笔记本一样。两个GPU。这样做的唯一方法是,据我所知,将使用OpenCL并在一个GPU中进行光线投射并在另一个GPU中进行渲染,但VTK中没有这样的体积渲染器。