Openmesh: обновление норм лица быстрее с Python, чем с C ++?

Я создал следующий простой 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;
}

Кроме того, я разработал следующий простой скрипт на Python с использованием привязок OpenMesh:

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 метод? Благодарю.

2

Решение

Я обнаружил, что я должен использовать параметры чтения при чтении файла в C ++, например так:

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

При этом скорость в C ++ выше, чем в Python. Однако в .от файлы, это обновление не является правильным, но это другая проблема.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]