mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-22 19:06:35 +00:00
World: do not refresh ticked chunks list every tick
this is just wasting CPU time, since the effects aren't noticeable on such a small timescale anyway. This reduces the CPU impact of chunk selection by 95%. However, this is the lesser part of chunk ticking, and the lion's share of the performance impact still comes from actually ticking the chunks.
This commit is contained in:
parent
99faeb8d05
commit
aebcfc516f
@ -160,6 +160,12 @@ 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>
|
||||||
@ -321,6 +327,12 @@ 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>
|
||||||
@ -1141,15 +1153,8 @@ class World implements ChunkManager{
|
|||||||
$this->chunkTickRadius = $radius;
|
$this->chunkTickRadius = $radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function tickChunks() : void{
|
private function selectTickedChunks() : void{
|
||||||
if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){
|
$this->tickingChunkCache = [];
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->timings->randomChunkUpdatesChunkSelection->startTiming();
|
|
||||||
|
|
||||||
/** @var bool[] $chunkTickList chunkhash => dummy */
|
|
||||||
$chunkTickList = [];
|
|
||||||
|
|
||||||
$centerChunks = [];
|
$centerChunks = [];
|
||||||
|
|
||||||
@ -1170,15 +1175,27 @@ class World implements ChunkManager{
|
|||||||
$centerChunkZ
|
$centerChunkZ
|
||||||
) as $hash){
|
) as $hash){
|
||||||
World::getXZ($hash, $chunkX, $chunkZ);
|
World::getXZ($hash, $chunkX, $chunkZ);
|
||||||
if(!isset($chunkTickList[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ)){
|
if(!isset($this->tickingChunkCache[$hash]) && isset($this->chunks[$hash]) && $this->isChunkTickable($chunkX, $chunkZ)){
|
||||||
$chunkTickList[$hash] = true;
|
$this->tickingChunkCache[$hash] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function tickChunks() : void{
|
||||||
|
if($this->chunkTickRadius <= 0 || count($this->tickingLoaders) === 0){
|
||||||
|
$this->tickingChunkCache = [];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(++$this->tickingChunkCacheRefreshTicker >= self::TICKING_CHUNK_CACHE_REFRESH_INTERVAL){
|
||||||
|
$this->tickingChunkCacheRefreshTicker = 0;
|
||||||
|
$this->timings->randomChunkUpdatesChunkSelection->startTiming();
|
||||||
|
$this->selectTickedChunks();
|
||||||
$this->timings->randomChunkUpdatesChunkSelection->stopTiming();
|
$this->timings->randomChunkUpdatesChunkSelection->stopTiming();
|
||||||
|
}
|
||||||
|
|
||||||
foreach($chunkTickList as $index => $_){
|
foreach($this->tickingChunkCache as $index => $_){
|
||||||
World::getXZ($index, $chunkX, $chunkZ);
|
World::getXZ($index, $chunkX, $chunkZ);
|
||||||
|
|
||||||
$this->tickChunk($chunkX, $chunkZ);
|
$this->tickChunk($chunkX, $chunkZ);
|
||||||
@ -2783,6 +2800,7 @@ 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