Switch to boost memory-mapped file to save RAM and potentially improve performance.

This commit is contained in:
Maeyanie
2025-09-09 09:11:35 -04:00
parent 0896a9e686
commit bf61f94bc4
+11 -17
View File
@@ -2,6 +2,8 @@
#include <utility> #include <utility>
#include <cstring> #include <cstring>
#include <boost/iostreams/device/mapped_file.hpp>
#include <draco/compression/decode.h> #include <draco/compression/decode.h>
#include <draco/io/mesh_io.h> #include <draco/io/mesh_io.h>
#include <draco/mesh/mesh.h> #include <draco/mesh/mesh.h>
@@ -21,37 +23,25 @@ namespace Slic3r {
bool load_drc(const char *path, TriangleMesh *meshptr) bool load_drc(const char *path, TriangleMesh *meshptr)
{ {
size_t size = boost::filesystem::file_size(path); try {
boost::iostreams::mapped_file_source file(path);
FILE *fp = boost::nowide::fopen(path, "rb");
if (fp == nullptr) {
return false;
}
char *data = new char[size];
if (fread(data, 1, size, fp) != size) {
fclose(fp);
delete[] data;
return false;
}
fclose(fp);
DecoderBuffer buffer; DecoderBuffer buffer;
buffer.Init(data, size); buffer.Init(file.data(), file.size());
auto geotype = Decoder::GetEncodedGeometryType(&buffer); auto geotype = Decoder::GetEncodedGeometryType(&buffer);
if ((!geotype.ok()) || geotype.value() != TRIANGULAR_MESH) { if ((!geotype.ok()) || geotype.value() != TRIANGULAR_MESH) {
delete[] data;
return false; return false;
} }
Decoder decoder; Decoder decoder;
Mesh dracoMesh; Mesh dracoMesh;
Status status = decoder.DecodeBufferToGeometry(&buffer, &dracoMesh); Status status = decoder.DecodeBufferToGeometry(&buffer, &dracoMesh);
delete[] data;
if (!status.ok()) { if (!status.ok()) {
return false; return false;
} }
file.close();
indexed_triangle_set its; indexed_triangle_set its;
@@ -79,6 +69,10 @@ bool load_drc(const char *path, TriangleMesh *meshptr)
*meshptr = TriangleMesh(std::move(its)); *meshptr = TriangleMesh(std::move(its));
if (meshptr->volume() < 0) if (meshptr->volume() < 0)
meshptr->flip_triangles(); meshptr->flip_triangles();
} catch (const std::exception& e) {
BOOST_LOG_TRIVIAL(error) << "load_drc: " << e.what();
return false;
}
return true; return true;
} }