Modified chunk generation garbage collector

This commit is contained in:
Shoghi Cervantes 2014-08-18 13:49:43 +02:00
parent 16774e66e6
commit 84a1b319c8
2 changed files with 15 additions and 27 deletions

View File

@ -33,9 +33,6 @@ class GenerationChunkManager implements ChunkManager{
/** @var FullChunk[] */ /** @var FullChunk[] */
protected $chunks = []; protected $chunks = [];
/** @var \SplObjectStorage<FullChunk> */
protected $unloadQueue;
/** @var Generator */ /** @var Generator */
protected $generator; protected $generator;
@ -55,8 +52,6 @@ class GenerationChunkManager implements ChunkManager{
$this->seed = $seed; $this->seed = $seed;
$this->manager = $manager; $this->manager = $manager;
$this->unloadQueue = new \SplObjectStorage();
$this->generator = new $class($options); $this->generator = new $class($options);
$this->generator->init($this, new Random($seed)); $this->generator->init($this, new Random($seed));
} }
@ -84,7 +79,6 @@ class GenerationChunkManager implements ChunkManager{
public function getChunk($chunkX, $chunkZ){ public function getChunk($chunkX, $chunkZ){
$index = Level::chunkHash($chunkX, $chunkZ); $index = Level::chunkHash($chunkX, $chunkZ);
$chunk = !isset($this->chunks[$index]) ? $this->requestChunk($chunkX, $chunkZ) : $this->chunks[$index]; $chunk = !isset($this->chunks[$index]) ? $this->requestChunk($chunkX, $chunkZ) : $this->chunks[$index];
$this->unloadQueue->detach($chunk);
$this->changes[$index] = $chunk; $this->changes[$index] = $chunk;
return $chunk; return $chunk;
} }
@ -100,24 +94,19 @@ class GenerationChunkManager implements ChunkManager{
$this->changes = []; $this->changes = [];
} }
public function cleanChangedChunk($index){
unset($this->changes[$index]);
}
public function doGarbageCollection(){ public function doGarbageCollection(){
if($this->unloadQueue->count() > 0){ foreach($this->chunks as $index => $chunk){
/** @var FullChunk $chunk */ if(!isset($this->changes[$index]) or $chunk->isPopulated()){
foreach($this->unloadQueue as $chunk){
if(isset($this->changes[$index = Level::chunkHash($chunk->getX(), $chunk->getZ())])){
continue;
}
unset($this->chunks[$index]); unset($this->chunks[$index]);
$this->unloadQueue->detach($chunk); unset($this->changes[$index]);
} }
} }
foreach($this->chunks as $chunk){ gc_collect_cycles();
if(isset($this->changes[$index = Level::chunkHash($chunk->getX(), $chunk->getZ())])){
continue;
}
$this->unloadQueue->attach($chunk);
}
} }
public function generateChunk($chunkX, $chunkZ){ public function generateChunk($chunkX, $chunkZ){
@ -164,7 +153,7 @@ class GenerationChunkManager implements ChunkManager{
protected function requestChunk($chunkX, $chunkZ){ protected function requestChunk($chunkX, $chunkZ){
$chunk = $this->manager->requestChunk($this->levelID, $chunkX, $chunkZ); $chunk = $this->manager->requestChunk($this->levelID, $chunkX, $chunkZ);
$this->chunks[$index = Level::chunkHash($chunkX, $chunkZ)] = $chunk; $this->chunks[$index = Level::chunkHash($chunkX, $chunkZ)] = $chunk;
return $this->chunks[$index]; return $chunk;
} }
/** /**

View File

@ -148,18 +148,17 @@ class GenerationManager{
$this->levels[$levelID]->populateChunk($chunkX, $chunkZ); //Request population directly $this->levels[$levelID]->populateChunk($chunkX, $chunkZ); //Request population directly
if(isset($this->levels[$levelID])){ if(isset($this->levels[$levelID])){
$this->generatedQueue[$levelID][$index] = true; $this->generatedQueue[$levelID][$index] = true;
if(count($this->generatedQueue[$levelID]) > 2){ foreach($this->levels[$levelID]->getChangedChunks() as $index => $chunk){
foreach($this->levels[$levelID]->getChangedChunks() as $chunk){ if($chunk->isPopulated()){
if($chunk->isPopulated()){ $this->sendChunk($levelID, $chunk);
$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->levels[$levelID]->doGarbageCollection();
$this->generatedQueue[$levelID] = []; $this->generatedQueue[$levelID] = [];
$this->levels[$levelID]->cleanChangedChunks();
} }
} }
} }