From 84a1b319c88edcc72a7f8bcc47404b4d390d1407 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Mon, 18 Aug 2014 13:49:43 +0200 Subject: [PATCH] Modified chunk generation garbage collector --- .../generator/GenerationChunkManager.php | 29 ++++++------------- .../level/generator/GenerationManager.php | 13 ++++----- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/pocketmine/level/generator/GenerationChunkManager.php b/src/pocketmine/level/generator/GenerationChunkManager.php index 7f561b8f5..8f1960dcc 100644 --- a/src/pocketmine/level/generator/GenerationChunkManager.php +++ b/src/pocketmine/level/generator/GenerationChunkManager.php @@ -33,9 +33,6 @@ class GenerationChunkManager implements ChunkManager{ /** @var FullChunk[] */ protected $chunks = []; - /** @var \SplObjectStorage */ - protected $unloadQueue; - /** @var Generator */ protected $generator; @@ -55,8 +52,6 @@ class GenerationChunkManager implements ChunkManager{ $this->seed = $seed; $this->manager = $manager; - $this->unloadQueue = new \SplObjectStorage(); - $this->generator = new $class($options); $this->generator->init($this, new Random($seed)); } @@ -84,7 +79,6 @@ class GenerationChunkManager implements ChunkManager{ public function getChunk($chunkX, $chunkZ){ $index = Level::chunkHash($chunkX, $chunkZ); $chunk = !isset($this->chunks[$index]) ? $this->requestChunk($chunkX, $chunkZ) : $this->chunks[$index]; - $this->unloadQueue->detach($chunk); $this->changes[$index] = $chunk; return $chunk; } @@ -100,24 +94,19 @@ class GenerationChunkManager implements ChunkManager{ $this->changes = []; } + public function cleanChangedChunk($index){ + unset($this->changes[$index]); + } + public function doGarbageCollection(){ - if($this->unloadQueue->count() > 0){ - /** @var FullChunk $chunk */ - foreach($this->unloadQueue as $chunk){ - if(isset($this->changes[$index = Level::chunkHash($chunk->getX(), $chunk->getZ())])){ - continue; - } + foreach($this->chunks as $index => $chunk){ + if(!isset($this->changes[$index]) or $chunk->isPopulated()){ unset($this->chunks[$index]); - $this->unloadQueue->detach($chunk); + unset($this->changes[$index]); } } - foreach($this->chunks as $chunk){ - if(isset($this->changes[$index = Level::chunkHash($chunk->getX(), $chunk->getZ())])){ - continue; - } - $this->unloadQueue->attach($chunk); - } + gc_collect_cycles(); } public function generateChunk($chunkX, $chunkZ){ @@ -164,7 +153,7 @@ class GenerationChunkManager implements ChunkManager{ protected function requestChunk($chunkX, $chunkZ){ $chunk = $this->manager->requestChunk($this->levelID, $chunkX, $chunkZ); $this->chunks[$index = Level::chunkHash($chunkX, $chunkZ)] = $chunk; - return $this->chunks[$index]; + return $chunk; } /** diff --git a/src/pocketmine/level/generator/GenerationManager.php b/src/pocketmine/level/generator/GenerationManager.php index 1014c6a09..34e133257 100644 --- a/src/pocketmine/level/generator/GenerationManager.php +++ b/src/pocketmine/level/generator/GenerationManager.php @@ -148,18 +148,17 @@ class GenerationManager{ $this->levels[$levelID]->populateChunk($chunkX, $chunkZ); //Request population directly if(isset($this->levels[$levelID])){ $this->generatedQueue[$levelID][$index] = true; - if(count($this->generatedQueue[$levelID]) > 2){ - foreach($this->levels[$levelID]->getChangedChunks() as $chunk){ - if($chunk->isPopulated()){ - $this->sendChunk($levelID, $chunk); - } + foreach($this->levels[$levelID]->getChangedChunks() as $index => $chunk){ + if($chunk->isPopulated()){ + $this->sendChunk($levelID, $chunk); + $this->levels[$levelID]->cleanChangedChunk($index); } - $this->levels[$levelID]->cleanChangedChunks(); } - if(count($this->generatedQueue[$levelID]) > 8){ + if(count($this->generatedQueue[$levelID]) > 4){ $this->levels[$levelID]->doGarbageCollection(); $this->generatedQueue[$levelID] = []; + $this->levels[$levelID]->cleanChangedChunks(); } } }