mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-20 16:00:20 +00:00
Modified chunk generation garbage collector
This commit is contained in:
parent
16774e66e6
commit
84a1b319c8
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user