我正在制作一个更简单的查看器来阅读和可视化网格。
VTK对我来说是新手,我首先想要找出为观众设置网格数据的最佳/最有效的方法。我看到有许多带有c ++的VTK示例,但其中很多都是转换为vtk格式或渲染基元。
我对转换为vtk格式不感兴趣,我只是将网格数据设置为 vtk非结构化网格或 vtk多边形数据集和渲染它。
我做了一点测试。下面的代码正确呈现,但这是设置数据集的最有效方法吗?如果我将.filter()
设置为1 000 000,它会起作用,但三角形循环看起来很慢。
N_SQUARES
答案 0 :(得分:1)
由于多种原因,示例中的代码可能会很慢
j
循环中的2个vtkTriangle实例。这很昂贵,可能是造成缓慢的最大原因。由于您构建了polydata,因此最好避免使用vtkTriangle。相反,做一些像
这样的事情for (int j = 0; j < N_SQUARES; ++j)
{
vtkIdType triangle1[3] = {j, j+1, j+2};
vtkIdType triangle2[3] = {j+2, j+3, j};
triangles->InsertNextCell(3, triangle1);
triangles->InsertNextCell(3, triangle2);
// ... or better yet, create a single quad:
vtkIdType quad[4] = {j, j+1, j+2, j+3};
triangles->InsertNextCell(4, quad);
}
你没有告诉VTK阵列(点坐标或连接)有多大会提前。这意味着VTK必须在增加数量时重新分配和复制数组。尝试在第一次循环之前添加nodes->GetData()->Allocate(4 * N_SQUARES);
(超过i
)。类似地,你可以告诉vtkCellArray提前分配适当数量的内存(有点棘手;它是一个整数数组,如下所示:nptsPerPoly0 ptId0Poly0 ptId1Poly0 ... ptIdNPoly0 nPtsPerPoly1 ...)。对于三角形,您可以调用triangles->Allocate((1 + 3) * 2 * N_SQUARES);
。对于前面示例中的四边形,它将是triangles->Allocate((1 + 4) * N_SQUARES);
。
nodes
和triangles
消耗的内存比必要的多得多。nodes
和triangles
数组。对于大型网格,VTK可以在多台计算机上运行,每台计算机只能保留部分网格(分布式内存并行)。N_SQUARES
大小,您可能会导致计算机使用交换文件或分区。在这种情况下,您应该减小网格的大小或使用分布式内存并行性。