c++ - 使用 Eigen 的网格:MatrixX3f 或 std::vector<Vector3f>?

标签 c++ graphics gpu eigen

我正在使用 Eigen具有经常变化的网格的计算机图形项目中的库。

对所有顶点位置、法线等使用动态特征矩阵对性能有何影响?

我应该使用:

Eigen::Matrix<float, Eigen::Dynamic, 3, Eigen::RowMajor> vertices;

std::vector<Eigen::Vector3f> vertices;

每次更改后,我都必须将网格数据复制到 GPU,但据我所知,我可以使用 memcpy 高效地完成这两种表示。

最佳答案

Vector 可能会消耗更多内存,因为它通常分配比存储数据所需的空间更多的空间,并且每次调整大小时,vector 都会调用 Eigen::Vector3f 的默认构造函数和析构函数。据我所知,默认的 Eigen::Vector3f 构造函数是空的,因此在发布版本中它的成本为零(但由于这个和调试迭代​​器,您可能会在调试版本中遇到性能问题)。另一方面,Eigen::Matrix 会在每次调整大小时重新分配内存(如果您使用 conservativeResize,它也会像 std::vector 一样复制内容),这很慢。

不过,我还是推荐你使用vector,因为它更方便。您可以动态添加元素,调整其大小而无需重新分配,在 vector 上使用标准算法更简单。如果你想确定你的 vector 不会消耗比需要更多的内存,你可以使用这个技巧来调整它的大小:

std::vector<Eigen::Vector3f> vertices;
vertices.swap( std::vector<Eigen::Vector3f>(size, Eigen::Vector3f()) );

或参见shrink_to_fit

是的,您可以使用 memcpy 使用两种表示形式高效地复制数据。但是使用 std::copy 将在发布版本中以相同的性能完成相同的工作(有时它甚至被编译器替换为 memcpy)。

但是,如果您仍然对性能不满意,这里有一些我为自己在这种情况下做出决定的提示:

  • 如果您要经常调整顶点数组的大小(添加或删除元素)-> 使用 std::vector 以避免频繁重新分配。
  • 如果您在顶点数组中存储大量数据 -> 使用 Eigen::Matrix 以避免过多的内存消耗。
  • 如果您对 Debug模式下的性能不满意(幸运的是,如果您经常处理顶点数组中的数据,这将是正确的)-> 使用 Eigen::MatrixSTL 调试迭代器会破坏性能(仅适用于 MSVC)

同时考虑 boost::shared_array (scoped_array),这些专为存储大块数据而不消耗额外内存而设计。在您的场景中使用它们更有意义。

关于c++ - 使用 Eigen 的网格:MatrixX3f 或 std::vector<Vector3f>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722062/

相关文章:

运行时 OpenCL 计算矩阵乘法时出错

c - 使用 CUDA C 的 2D 矩阵的积分图像或求和面积表

c++ - 如何在 Windows 的桌面上绘制文字?

graphics - 我需要一种算法来渲染柔和的画笔笔触

c++ - 在另一个中声明一个类成员

java - 重绘树叶轨迹

java - 使用java仅显示图像的一部分

c++ - 与 MATLAB 相比,使用 cuSolver 时 SVD 非常慢

c++ - Visual Studio 2010 - C++ 编译时 IntelliSense 错误

c++ - 在分配的内存之外写入