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.
This commit is contained in:
Dylan K. Taylor 2022-12-19 20:57:51 +00:00
parent aebcfc516f
commit 923dcec4e7
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -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<int, Player>
@ -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<int, true>
*/
private array $tickingChunkCache = [];
/**
* @var true[]
* @phpstan-var array<int, true>
@ -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");