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[] */
protected $chunks = [];
/** @var \SplObjectStorage<FullChunk> */
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;
}
/**

View File

@ -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();
}
}
}