mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-23 19:34:15 +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;
|
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
|
* @var Player[] entity runtime ID => Player
|
||||||
* @phpstan-var array<int, Player>
|
* @phpstan-var array<int, Player>
|
||||||
@ -327,12 +321,6 @@ class World implements ChunkManager{
|
|||||||
|
|
||||||
private int $chunkTickRadius;
|
private int $chunkTickRadius;
|
||||||
private int $tickedBlocksPerSubchunkPerTick = self::DEFAULT_TICKED_BLOCKS_PER_SUBCHUNK_PER_TICK;
|
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[]
|
* @var true[]
|
||||||
* @phpstan-var array<int, true>
|
* @phpstan-var array<int, true>
|
||||||
@ -1153,8 +1141,15 @@ class World implements ChunkManager{
|
|||||||
$this->chunkTickRadius = $radius;
|
$this->chunkTickRadius = $radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function selectTickedChunks() : void{
|
private function tickChunks() : void{
|
||||||
$this->tickingChunkCache = [];
|
if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->timings->randomChunkUpdatesChunkSelection->startTiming();
|
||||||
|
|
||||||
|
/** @var bool[] $chunkTickList chunkhash => dummy */
|
||||||
|
$chunkTickList = [];
|
||||||
|
|
||||||
$centerChunks = [];
|
$centerChunks = [];
|
||||||
|
|
||||||
@ -1175,27 +1170,15 @@ class World implements ChunkManager{
|
|||||||
$centerChunkZ
|
$centerChunkZ
|
||||||
) as $hash){
|
) as $hash){
|
||||||
World::getXZ($hash, $chunkX, $chunkZ);
|
World::getXZ($hash, $chunkX, $chunkZ);
|
||||||
if(!isset($this->tickingChunkCache[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ)){
|
if(!isset($chunkTickList[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ)){
|
||||||
$this->tickingChunkCache[$hash] = true;
|
$chunkTickList[$hash] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private function tickChunks() : void{
|
$this->timings->randomChunkUpdatesChunkSelection->stopTiming();
|
||||||
if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){
|
|
||||||
$this->tickingChunkCache = [];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(++$this->tickingChunkCacheRefreshTicker >= self::TICKING_CHUNK_CACHE_REFRESH_INTERVAL){
|
foreach($chunkTickList as $index => $_){
|
||||||
$this->tickingChunkCacheRefreshTicker = 0;
|
|
||||||
$this->timings->randomChunkUpdatesChunkSelection->startTiming();
|
|
||||||
$this->selectTickedChunks();
|
|
||||||
$this->timings->randomChunkUpdatesChunkSelection->stopTiming();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($this->tickingChunkCache as $index => $_){
|
|
||||||
World::getXZ($index, $chunkX, $chunkZ);
|
World::getXZ($index, $chunkX, $chunkZ);
|
||||||
|
|
||||||
$this->tickChunk($chunkX, $chunkZ);
|
$this->tickChunk($chunkX, $chunkZ);
|
||||||
@ -2800,7 +2783,6 @@ class World implements ChunkManager{
|
|||||||
unset($this->chunks[$chunkHash]);
|
unset($this->chunks[$chunkHash]);
|
||||||
unset($this->blockCache[$chunkHash]);
|
unset($this->blockCache[$chunkHash]);
|
||||||
unset($this->changedBlocks[$chunkHash]);
|
unset($this->changedBlocks[$chunkHash]);
|
||||||
unset($this->tickingChunkCache[$chunkHash]);
|
|
||||||
|
|
||||||
if(array_key_exists($chunkHash, $this->chunkPopulationRequestMap)){
|
if(array_key_exists($chunkHash, $this->chunkPopulationRequestMap)){
|
||||||
$this->logger->debug("Rejecting population promise for chunk $x $z");
|
$this->logger->debug("Rejecting population promise for chunk $x $z");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user