From 9c122bda5eeb2fa96edae58de7e6092f6d54a721 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci <aar@cpan.org> Date: Tue, 19 Mar 2013 16:02:03 +0100 Subject: [PATCH] Fix memory leak in avoid_crossing_perimeters. #1044 --- lib/Slic3r/GCode/MotionPlanner.pm | 8 +++++++- lib/Slic3r/Print.pm | 16 ++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/Slic3r/GCode/MotionPlanner.pm b/lib/Slic3r/GCode/MotionPlanner.pm index 3708a65e3..114f6a2be 100644 --- a/lib/Slic3r/GCode/MotionPlanner.pm +++ b/lib/Slic3r/GCode/MotionPlanner.pm @@ -168,11 +168,17 @@ sub BUILD { lines => \@lines, points => [ values %{$self->_pointmap} ], no_arrows => 1, - polygons => [ map @$_, @{$self->islands} ], + expolygons => $self->islands, #red_polygons => [ map $_->holes, map @$_, @{$self->_inner} ], #white_polygons => [ map @$_, @{$self->_outer} ], ); printf "%d islands\n", scalar @{$self->islands}; + + eval "use Devel::Size"; + print "MEMORY USAGE:\n"; + printf " %-19s = %.1fMb\n", $_, Devel::Size::total_size($self->$_)/1024/1024 + for qw(_inner _outer _contours_ex _pointmap _edges _crossing_edges islands last_crossings); + printf " %-19s = %.1fMb\n", 'self', Devel::Size::total_size($self)/1024/1024; } } diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index dded13f5e..7fa1db9f4 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -881,24 +881,24 @@ sub write_gcode { if ($Slic3r::Config->avoid_crossing_perimeters) { push @islands, map +{ perimeters => [], fills => [] }, @{$layer->slices}; PERIMETER: foreach my $perimeter (@{$layerm->perimeters}) { - $perimeter = $perimeter->unpack; + my $p = $perimeter->unpack; for my $i (0 .. $#{$layer->slices}-1) { - if ($layer->slices->[$i]->contour->encloses_point($perimeter->first_point)) { - push @{ $islands[$i]{perimeters} }, $perimeter; + if ($layer->slices->[$i]->contour->encloses_point($p->first_point)) { + push @{ $islands[$i]{perimeters} }, $p; next PERIMETER; } } - push @{ $islands[-1]{perimeters} }, $perimeter; # optimization + push @{ $islands[-1]{perimeters} }, $p; # optimization } FILL: foreach my $fill (@{$layerm->fills}) { + my $f = $fill->unpack; for my $i (0 .. $#{$layer->slices}-1) { - $fill = $fill->unpack; - if ($layer->slices->[$i]->contour->encloses_point($fill->first_point)) { - push @{ $islands[$i]{fills} }, $fill; + if ($layer->slices->[$i]->contour->encloses_point($f->first_point)) { + push @{ $islands[$i]{fills} }, $f; next FILL; } } - push @{ $islands[-1]{fills} }, $fill; # optimization + push @{ $islands[-1]{fills} }, $f; # optimization } } else { push @islands, {