World: avoid hammering the disk looking for known ungenerated chunks

closes #6679

judging by the debug logs, this actually happens a lot during initial world generation,
which I suppose isn't that surprising.
This commit is contained in:
Dylan K. Taylor 2025-07-25 18:01:02 +01:00
parent 051671df50
commit d41f1b2889
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -289,6 +289,12 @@ class World implements ChunkManager{
*/
private array $chunks = [];
/**
* @var true[]
* @phpstan-var array<ChunkPosHash, true>
*/
private array $knownUngeneratedChunks = [];
/**
* @var Vector3[][] chunkHash => [relativeBlockHash => Vector3]
* @phpstan-var array<ChunkPosHash, array<ChunkBlockPosHash, Vector3>>
@ -625,6 +631,7 @@ class World implements ChunkManager{
self::getXZ($chunkHash, $chunkX, $chunkZ);
$this->unloadChunk($chunkX, $chunkZ, false);
}
$this->knownUngeneratedChunks = [];
foreach($this->entitiesByChunk as $chunkHash => $entities){
self::getXZ($chunkHash, $chunkX, $chunkZ);
@ -2667,6 +2674,7 @@ class World implements ChunkManager{
}
$this->chunks[$chunkHash] = $chunk;
unset($this->knownUngeneratedChunks[$chunkHash]);
$this->blockCacheSize -= count($this->blockCache[$chunkHash] ?? []);
unset($this->blockCache[$chunkHash]);
@ -2931,6 +2939,9 @@ class World implements ChunkManager{
if(isset($this->chunks[$chunkHash = World::chunkHash($x, $z)])){
return $this->chunks[$chunkHash];
}
if(isset($this->knownUngeneratedChunks[$chunkHash])){
return null;
}
$this->timings->syncChunkLoad->startTiming();
@ -2950,6 +2961,7 @@ class World implements ChunkManager{
if($loadedChunkData === null){
$this->timings->syncChunkLoad->stopTiming();
$this->knownUngeneratedChunks[$chunkHash] = true;
return null;
}