Openmesh:用 Python 比用 C++ 更快地更新面法线?

Posted

技术标签:

【中文标题】Openmesh:用 Python 比用 C++ 更快地更新面法线?【英文标题】:Openmesh: updating face normals faster with Python than with C++? 【发布时间】:2017-03-03 11:03:41 【问题描述】:

我使用 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 方法的事情?谢谢。

【问题讨论】:

您是否在 C++ 中启用了优化?还要记住,C++ 不是灵丹妙药。事实上,你可以很容易地在 C++ 上编写比 bash 还要慢的糟糕代码。 是的,我做到了。此外,C++ 代码与 Python 代码差不多,我只是使用 OpenMesh 提供的 Python 绑定。 【参考方案1】:

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

OpenMesh::IO::read_mesh(OM_mesh, filename, ropt);

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

【讨论】:

以上是关于Openmesh:用 Python 比用 C++ 更快地更新面法线?的主要内容,如果未能解决你的问题,请参考以下文章

[EuroPython2021笔记] Python反面模式 -- 用空格的比用tab的收入高

[EuroPython2021笔记] Python反面模式 -- 用空格的比用tab的收入高

<2x1;OpenMesh译稿:使用并理解OpenMesh-OpenMesh的功能和目标

vs2010下的openmesh配置(用的是OpenMesh2.3-32bit)

生成球 使用openMesh 库

OpenMesh 将默认的 float 类型改为 double 类型