Openmesh:使用Python比使用C ++更快地更新face normals?

时间:2017-03-03 11:03:41

标签: python c++ boost-python openmesh

我用OpenMesh创建了以下简单的C ++脚本:

#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 方法?感谢。

1 个答案:

答案 0 :(得分:2)

我在使用C ++读取文件时发现我应该使用读取选项,如下所示:

LoginActivity

通过这样做,C ++中的速度高于Python。但是,在 .off 文件中,此更新不正确,但这是另一个问题。