From 78bb6f4a0c9c6190c701514a0b64694a68af4a2f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 7 May 2019 19:26:01 +0100 Subject: [PATCH] Reduce complexity of chunk sending system --- src/pocketmine/Player.php | 41 +++++++++++++-------------------- src/pocketmine/world/World.php | 42 ---------------------------------- 2 files changed, 16 insertions(+), 67 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 492a58d8b..ed9297290 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -969,30 +969,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, unset($this->loadQueue[$index]); } - public function onChunkReady(int $x, int $z){ - if(!$this->isConnected()){ - return; - } - - assert(isset($this->usedChunks[World::chunkHash($x, $z)])); - $this->usedChunks[World::chunkHash($x, $z)] = true; - - $this->networkSession->startUsingChunk($x, $z, function(int $chunkX, int $chunkZ) : void{ - if($this->spawned){ - $this->spawnEntitiesOnChunk($chunkX, $chunkZ); - }elseif($this->spawnChunkLoadCount++ === $this->spawnThreshold){ - $this->spawned = true; - - foreach($this->usedChunks as $chunkHash => $_){ - World::getXZ($chunkHash, $_x, $_z); - $this->spawnEntitiesOnChunk($_x, $_z); - } - - $this->networkSession->onTerrainReady(); - } - }); - } - protected function spawnEntitiesOnChunk(int $chunkX, int $chunkZ) : void{ foreach($this->world->getChunkEntities($chunkX, $chunkZ) as $entity){ if($entity !== $this and !$entity->isClosed() and !$entity->isFlaggedForDespawn()){ @@ -1030,7 +1006,22 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, } unset($this->loadQueue[$index]); - $this->world->requestChunk($X, $Z, $this); + $this->usedChunks[$index] = true; + + $this->networkSession->startUsingChunk($X, $Z, function(int $chunkX, int $chunkZ) : void{ + if($this->spawned){ + $this->spawnEntitiesOnChunk($chunkX, $chunkZ); + }elseif($this->spawnChunkLoadCount++ === $this->spawnThreshold){ + $this->spawned = true; + + foreach($this->usedChunks as $chunkHash => $_){ + World::getXZ($chunkHash, $_x, $_z); + $this->spawnEntitiesOnChunk($_x, $_z); + } + + $this->networkSession->onTerrainReady(); + } + }); } Timings::$playerChunkSendTimer->stopTiming(); diff --git a/src/pocketmine/world/World.php b/src/pocketmine/world/World.php index b97ab5cca..5ec601373 100644 --- a/src/pocketmine/world/World.php +++ b/src/pocketmine/world/World.php @@ -70,7 +70,6 @@ use pocketmine\timings\Timings; use pocketmine\utils\ReversePriorityQueue; use pocketmine\world\biome\Biome; use pocketmine\world\format\Chunk; -use pocketmine\world\format\ChunkException; use pocketmine\world\format\EmptySubChunk; use pocketmine\world\format\io\exception\CorruptedChunkException; use pocketmine\world\format\io\exception\UnsupportedChunkFormatException; @@ -217,9 +216,6 @@ class World implements ChunkManager, Metadatable{ /** @var bool[] blockhash => dummy */ private $neighbourBlockUpdateQueueIndex = []; - /** @var Player[][] */ - private $chunkSendQueue = []; - /** @var bool[] */ private $chunkPopulationQueue = []; /** @var bool[] */ @@ -865,7 +861,6 @@ class World implements ChunkManager, Metadatable{ foreach($this->players as $p){ $p->doChunkRequests(); } - $this->processChunkRequests(); if($this->sleepTicks > 0 and --$this->sleepTicks <= 0){ $this->checkSleep(); @@ -2407,42 +2402,6 @@ class World implements ChunkManager, Metadatable{ (new SpawnChangeEvent($this, $previousSpawn))->call(); } - public function requestChunk(int $x, int $z, Player $player){ - $index = World::chunkHash($x, $z); - if(!isset($this->chunkSendQueue[$index])){ - $this->chunkSendQueue[$index] = []; - } - - $this->chunkSendQueue[$index][spl_object_id($player)] = $player; - } - - private function processChunkRequests(){ - if(count($this->chunkSendQueue) > 0){ - $this->timings->syncChunkSendTimer->startTiming(); - - foreach($this->chunkSendQueue as $index => $players){ - World::getXZ($index, $x, $z); - - $this->timings->syncChunkSendPrepareTimer->startTiming(); - - $chunk = $this->chunks[$index] ?? null; - if($chunk === null or !$chunk->isGenerated() or !$chunk->isPopulated()){ - throw new ChunkException("Invalid Chunk sent"); - } - - foreach($players as $player){ - $player->onChunkReady($x, $z); - } - - $this->timings->syncChunkSendPrepareTimer->stopTiming(); - } - - $this->chunkSendQueue = []; - - $this->timings->syncChunkSendTimer->stopTiming(); - } - } - /** * @param Entity $entity * @@ -2670,7 +2629,6 @@ class World implements ChunkManager, Metadatable{ unset($this->chunks[$chunkHash]); unset($this->blockCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); - unset($this->chunkSendQueue[$chunkHash]); $this->timings->doChunkUnload->stopTiming();