mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-09 11:31:49 +00:00
performance: only calculate light for chunks inside ticking areas
this produces a major performance improvement for large render distances, and reduces the impact of lighting calculation to zero on servers which have random blockupdates turned off.
This commit is contained in:
parent
b727972c76
commit
89cce4c749
@ -895,7 +895,13 @@ class World implements ChunkManager{
|
|||||||
$dz = mt_rand(-$randRange, $randRange);
|
$dz = mt_rand(-$randRange, $randRange);
|
||||||
$hash = World::chunkHash($dx + $chunkX, $dz + $chunkZ);
|
$hash = World::chunkHash($dx + $chunkX, $dz + $chunkZ);
|
||||||
if(!isset($chunkTickList[$hash]) and isset($this->chunks[$hash])){
|
if(!isset($chunkTickList[$hash]) and isset($this->chunks[$hash])){
|
||||||
if(!$this->chunks[$hash]->isLightPopulated()){
|
//TODO: this might need to be checked after adjacent chunks are loaded in future
|
||||||
|
$lightPopulatedState = $this->chunks[$hash]->isLightPopulated();
|
||||||
|
if($lightPopulatedState !== true){
|
||||||
|
if($lightPopulatedState === false){
|
||||||
|
$this->chunks[$hash]->setLightPopulated(null);
|
||||||
|
$this->server->getAsyncPool()->submitTask(new LightPopulationTask($this, $this->chunks[$hash]));
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
//check adjacent chunks are loaded
|
//check adjacent chunks are loaded
|
||||||
@ -2143,10 +2149,6 @@ class World implements ChunkManager{
|
|||||||
|
|
||||||
(new ChunkLoadEvent($this, $chunk, !$chunk->isGenerated()))->call();
|
(new ChunkLoadEvent($this, $chunk, !$chunk->isGenerated()))->call();
|
||||||
|
|
||||||
if($chunk->isPopulated()){
|
|
||||||
$this->getServer()->getAsyncPool()->submitTask(new LightPopulationTask($this, $chunk));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!$this->isChunkInUse($x, $z)){
|
if(!$this->isChunkInUse($x, $z)){
|
||||||
$this->logger->debug("Newly loaded chunk $x $z has no loaders registered, will be unloaded at next available opportunity");
|
$this->logger->debug("Newly loaded chunk $x $z has no loaders registered, will be unloaded at next available opportunity");
|
||||||
$this->unloadChunkRequest($x, $z);
|
$this->unloadChunkRequest($x, $z);
|
||||||
|
@ -58,7 +58,7 @@ class Chunk{
|
|||||||
/** @var int */
|
/** @var int */
|
||||||
private $dirtyFlags = 0;
|
private $dirtyFlags = 0;
|
||||||
|
|
||||||
/** @var bool */
|
/** @var bool|null */
|
||||||
protected $lightPopulated = false;
|
protected $lightPopulated = false;
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
protected $terrainGenerated = false;
|
protected $terrainGenerated = false;
|
||||||
@ -387,11 +387,11 @@ class Chunk{
|
|||||||
$this->dirtyFlags |= self::DIRTY_FLAG_BIOMES;
|
$this->dirtyFlags |= self::DIRTY_FLAG_BIOMES;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isLightPopulated() : bool{
|
public function isLightPopulated() : ?bool{
|
||||||
return $this->lightPopulated;
|
return $this->lightPopulated;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setLightPopulated(bool $value = true) : void{
|
public function setLightPopulated(?bool $value = true) : void{
|
||||||
$this->lightPopulated = $value;
|
$this->lightPopulated = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ final class FastChunkSerializer{
|
|||||||
* TODO: tiles and entities
|
* TODO: tiles and entities
|
||||||
*/
|
*/
|
||||||
public static function serialize(Chunk $chunk, bool $includeLight = true) : string{
|
public static function serialize(Chunk $chunk, bool $includeLight = true) : string{
|
||||||
$includeLight = $includeLight && $chunk->isLightPopulated();
|
$includeLight = $includeLight && $chunk->isLightPopulated() === true;
|
||||||
|
|
||||||
$stream = new BinaryStream();
|
$stream = new BinaryStream();
|
||||||
$stream->putInt($chunk->getX());
|
$stream->putInt($chunk->getX());
|
||||||
|
@ -53,6 +53,7 @@ class LightPopulationTask extends AsyncTask{
|
|||||||
public function __construct(World $world, Chunk $chunk){
|
public function __construct(World $world, Chunk $chunk){
|
||||||
$this->storeLocal(self::TLS_KEY_WORLD, $world);
|
$this->storeLocal(self::TLS_KEY_WORLD, $world);
|
||||||
[$this->chunkX, $this->chunkZ] = [$chunk->getX(), $chunk->getZ()];
|
[$this->chunkX, $this->chunkZ] = [$chunk->getX(), $chunk->getZ()];
|
||||||
|
$chunk->setLightPopulated(null);
|
||||||
$this->chunk = FastChunkSerializer::serialize($chunk);
|
$this->chunk = FastChunkSerializer::serialize($chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user