mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-04-20 16:00:20 +00:00
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:
parent
aebcfc516f
commit
923dcec4e7
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user