我正在使用 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()) );
是的,您可以使用 memcpy 使用两种表示形式高效地复制数据。但是使用 std::copy
将在发布版本中以相同的性能完成相同的工作(有时它甚至被编译器替换为 memcpy
)。
但是,如果您仍然对性能不满意,这里有一些我为自己在这种情况下做出决定的提示:
- 如果您要经常调整顶点数组的大小(添加或删除元素)-> 使用
std::vector
以避免频繁重新分配。 - 如果您在顶点数组中存储大量数据 -> 使用
Eigen::Matrix
以避免过多的内存消耗。 - 如果您对 Debug模式下的性能不满意(幸运的是,如果您经常处理顶点数组中的数据,这将是正确的)-> 使用
Eigen::Matrix
,STL
调试迭代器会破坏性能(仅适用于 MSVC)
同时考虑 boost::shared_array (scoped_array),这些专为存储大块数据而不消耗额外内存而设计。在您的场景中使用它们更有意义。
关于c++ - 使用 Eigen 的网格:MatrixX3f 或 std::vector<Vector3f>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13722062/