mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-14 03:11:19 +00:00
Take the print config by reference while simplifying extrusions
simplify_path, simplify_multi_path and simplify_loop each copied the whole PrintConfig, 10520 bytes with around 200 heap owning members, once per extrusion entity, from inside the parallel_for over all layers. LayerRegion.cpp already binds a reference a few hundred lines above. Three more sites in Layer.cpp do the same thing. The tree support changes in the same area: draw_circles() dropped layers from an owning vector without deleting them, so every re-slice leaked the layers above the topmost overhang. std::stable_partition rather than std::remove_if, because remove_if leaves moved-from duplicates of kept pointers in the tail and deleting those would be a double free. The collision and avoidance accessors returned ExPolygons by value out of a cache that hands them out by reference, several times per node per layer. The preview cache is released when the support step finishes instead of at the start of the next slice; nothing reads it in between. set_shared_object() now releases the layers the object still owns before it starts aliasing another object's. Both clear functions are no-ops once the alias is set, so this cannot free the sharee's layers. PrintObjectSlice.cpp: eps was a function local static inside a parallel_for, so slice_closing_radius was latched once per process. This one changes output for projects that override it per object, or on a re-slice after editing it. The old behaviour was undefined: whichever object won the race set it for the session.
This commit is contained in:
@@ -987,6 +987,9 @@ void PrintObject::generate_support_material()
|
||||
this->_generate_support_material();
|
||||
m_print->throw_if_canceled();
|
||||
}
|
||||
// Orca: the tree support collision/avoidance caches and support nodes are only used while this step runs
|
||||
// (detect_overhangs() rebuilds them from scratch), so don't keep them resident until the next slice.
|
||||
this->clear_tree_support_preview_cache();
|
||||
this->set_done(posSupportMaterial);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user