From 923dcec4e766314e8393c8d0926854505296e027 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 19 Dec 2022 20:57:51 +0000 Subject: [PATCH] Revert "World: do not refresh ticked chunks list every tick" This reverts commit aebcfc516ff97492c58ee478a3944915a777a75e. this has edge cases in the handling of adjacent chunk locks which I didn't consider at the time. Once accounting for those edge cases, it became significantly more complex to the point that I realized this needed more planning. --- src/world/World.php | 44 +++++++++++++------------------------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/src/world/World.php b/src/world/World.php index a448a9b62..b20960755 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -160,12 +160,6 @@ class World implements ChunkManager{ public const DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK = 3; - /** - * Ticking chunk cache is refreshed after this many ticks. Increasing this value increases the interval between - * cache refreshes, which can cause longer delays before newly loaded chunks start being ticked. - */ - private const TICKING_CHUNK_CACHE_REFRESH_INTERVAL = 20; - /** * @var Player[] entity runtime ID => Player * @phpstan-var array @@ -327,12 +321,6 @@ class World implements ChunkManager{ private int $chunkTickRadius; private int $tickedBlocksPerSubchunkPerTick = self::DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK; - private int $tickingChunkCacheRefreshTicker = 0; - /** - * @var true[] - * @phpstan-var array - */ - private array $tickingChunkCache = []; /** * @var true[] * @phpstan-var array @@ -1153,8 +1141,15 @@ class World implements ChunkManager{ $this->chunkTickRadius = $radius; } - private function selectTickedChunks() : void{ - $this->tickingChunkCache = []; + private function tickChunks() : void{ + if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){ + return; + } + + $this->timings->randomChunkUpdatesChunkSelection->startTiming(); + + /** @var bool[] $chunkTickList chunkhash => dummy */ + $chunkTickList = []; $centerChunks = []; @@ -1175,27 +1170,15 @@ class World implements ChunkManager{ $centerChunkZ ) as $hash){ World::getXZ($hash, $chunkX, $chunkZ); - if(!isset($this->tickingChunkCache[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ)){ - $this->tickingChunkCache[$hash] = true; + if(!isset($chunkTickList[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ)){ + $chunkTickList[$hash] = true; } } } - } - private function tickChunks() : void{ - if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){ - $this->tickingChunkCache = []; - return; - } + $this->timings->randomChunkUpdatesChunkSelection->stopTiming(); - if(++$this->tickingChunkCacheRefreshTicker >= self::TICKING_CHUNK_CACHE_REFRESH_INTERVAL){ - $this->tickingChunkCacheRefreshTicker = 0; - $this->timings->randomChunkUpdatesChunkSelection->startTiming(); - $this->selectTickedChunks(); - $this->timings->randomChunkUpdatesChunkSelection->stopTiming(); - } - - foreach($this->tickingChunkCache as $index => $_){ + foreach($chunkTickList as $index => $_){ World::getXZ($index, $chunkX, $chunkZ); $this->tickChunk($chunkX, $chunkZ); @@ -2800,7 +2783,6 @@ class World implements ChunkManager{ unset($this->chunks[$chunkHash]); unset($this->blockCache[$chunkHash]); unset($this->changedBlocks[$chunkHash]); - unset($this->tickingChunkCache[$chunkHash]); if(array_key_exists($chunkHash, $this->chunkPopulationRequestMap)){ $this->logger->debug("Rejecting population promise for chunk $x $z");