我用C++创建了以下简单的OpenMesh脚本:
#include <string>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
struct MyTraits : OpenMesh::DefaultTraits{
typedef OpenMesh::Vec3d Point;
typedef OpenMesh::Vec3d Normal;
};
typedef OpenMesh::TriMesh_ArrayKernelT<MyTraits> MyMesh;
int main(int argc, char *argv[]){
std::string filename = "filename.stl";
MyMesh OM_mesh;
OM_mesh.request_face_normals();
OM_mesh.request_halfedge_normals();
OM_mesh.request_vertex_normals();
OM_mesh.request_face_status();
OM_mesh.request_edge_status();
OM_mesh.request_halfedge_status();
OM_mesh.request_vertex_status();
OpenMesh::IO::Options ropt;
ropt += OpenMesh::IO::Options::Binary;
ropt += OpenMesh::IO::Options::FaceNormal;
OpenMesh::IO::read_mesh(OM_mesh, filename);
for(int k=0; k<1000; k++){
OM_mesh.update_face_normals();
}
return 0;
}此外,我还使用OpenMesh绑定开发了以下简单的Python脚本:
import openmesh as OM
filename = "filename.stl"
OM_mesh = OM.TriMesh()
OM_mesh.request_face_normals()
OM_mesh.request_halfedge_normals()
OM_mesh.request_vertex_normals()
OM_mesh.request_face_status()
OM_mesh.request_edge_status()
OM_mesh.request_halfedge_status()
OM_mesh.request_vertex_status()
options = OM.Options()
options += OM.Options.Binary
options += OM.Options.FaceNormal
OM.read_mesh(OM_mesh, filename, options)
for k in range(1000):
OM_mesh.update_face_normals()两个脚本都会更新加载网格的脸法线1000次。我预计C++脚本会比Python快得多,但实际上恰恰相反。我发现C++脚本花费大约8秒,而Python仅花费0.3秒。
这怎么可能?Python绑定所做的事情与仅仅“包装”C++ update_face_normals方法不同吗?谢谢。
发布于 2017-03-03 13:52:05
在C++中读取文件时,我发现应该使用这些读取选项,如下所示:
OpenMesh::IO::read_mesh(OM_mesh, filename, ropt);通过这样做,C++中的速度要高于Python中的速度。但是,在.off文件中,此更新是不正确的,但这是另一个问题。
https://stackoverflow.com/questions/42577185
复制相似问题