mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-10 21:45:35 +00:00
Level: Stop unnecessarily initializing the generator on the main thread
this is just slowing down startup times for no good reason.
This commit is contained in:
parent
7fce48d38c
commit
c493d0e6ac
@ -239,10 +239,8 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
/** @var int */
|
/** @var int */
|
||||||
public $tickRateCounter = 0;
|
public $tickRateCounter = 0;
|
||||||
|
|
||||||
/** @var Generator */
|
/** @var string|Generator */
|
||||||
private $generator;
|
private $generator;
|
||||||
/** @var Generator */
|
|
||||||
private $generatorInstance;
|
|
||||||
|
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
private $closed = false;
|
private $closed = false;
|
||||||
@ -379,17 +377,13 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function initLevel(){
|
public function initLevel(){
|
||||||
$generator = $this->generator;
|
|
||||||
$this->generatorInstance = new $generator($this->provider->getGeneratorOptions());
|
|
||||||
$this->generatorInstance->init($this, new Random($this->getSeed()));
|
|
||||||
|
|
||||||
$this->registerGenerator();
|
$this->registerGenerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function registerGenerator(){
|
public function registerGenerator(){
|
||||||
$size = $this->server->getScheduler()->getAsyncTaskPoolSize();
|
$size = $this->server->getScheduler()->getAsyncTaskPoolSize();
|
||||||
for($i = 0; $i < $size; ++$i){
|
for($i = 0; $i < $size; ++$i){
|
||||||
$this->server->getScheduler()->scheduleAsyncTaskToWorker(new GeneratorRegisterTask($this, $this->generatorInstance), $i);
|
$this->server->getScheduler()->scheduleAsyncTaskToWorker(new GeneratorRegisterTask($this, $this->generator, $this->provider->getGeneratorOptions()), $i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ abstract class BaseLevelProvider implements LevelProvider{
|
|||||||
|
|
||||||
protected function fixLevelData() : void{
|
protected function fixLevelData() : void{
|
||||||
if(!$this->levelData->hasTag("generatorName", StringTag::class)){
|
if(!$this->levelData->hasTag("generatorName", StringTag::class)){
|
||||||
$this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT"), true);
|
$this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$this->levelData->hasTag("generatorOptions", StringTag::class)){
|
if(!$this->levelData->hasTag("generatorOptions", StringTag::class)){
|
||||||
|
@ -121,7 +121,7 @@ class LevelDB extends BaseLevelProvider{
|
|||||||
if($this->levelData->hasTag("Generator", IntTag::class)){
|
if($this->levelData->hasTag("Generator", IntTag::class)){
|
||||||
switch($this->levelData->getInt("Generator")){ //Detect correct generator from MCPE data
|
switch($this->levelData->getInt("Generator")){ //Detect correct generator from MCPE data
|
||||||
case self::GENERATOR_FLAT:
|
case self::GENERATOR_FLAT:
|
||||||
$this->levelData->setString("generatorName", (string) Generator::getGenerator("FLAT"));
|
$this->levelData->setString("generatorName", Generator::getGenerator("FLAT"));
|
||||||
if(($layers = $db->get(self::ENTRY_FLAT_WORLD_LAYERS)) !== false){ //Detect existing custom flat layers
|
if(($layers = $db->get(self::ENTRY_FLAT_WORLD_LAYERS)) !== false){ //Detect existing custom flat layers
|
||||||
$layers = trim($layers, "[]");
|
$layers = trim($layers, "[]");
|
||||||
}else{
|
}else{
|
||||||
@ -131,7 +131,7 @@ class LevelDB extends BaseLevelProvider{
|
|||||||
break;
|
break;
|
||||||
case self::GENERATOR_INFINITE:
|
case self::GENERATOR_INFINITE:
|
||||||
//TODO: add a null generator which does not generate missing chunks (to allow importing back to MCPE and generating more normal terrain without PocketMine messing things up)
|
//TODO: add a null generator which does not generate missing chunks (to allow importing back to MCPE and generating more normal terrain without PocketMine messing things up)
|
||||||
$this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT"));
|
$this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT"));
|
||||||
$this->levelData->setString("generatorOptions", "");
|
$this->levelData->setString("generatorOptions", "");
|
||||||
break;
|
break;
|
||||||
case self::GENERATOR_LIMITED:
|
case self::GENERATOR_LIMITED:
|
||||||
@ -140,7 +140,7 @@ class LevelDB extends BaseLevelProvider{
|
|||||||
throw new LevelException("Unknown LevelDB world format type, this level cannot be loaded");
|
throw new LevelException("Unknown LevelDB world format type, this level cannot be loaded");
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
$this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT"));
|
$this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ abstract class Generator{
|
|||||||
/**
|
/**
|
||||||
* @param $name
|
* @param $name
|
||||||
*
|
*
|
||||||
* @return Generator
|
* @return string|Generator Name of class that extends Generator (not an actual Generator object)
|
||||||
*/
|
*/
|
||||||
public static function getGenerator($name){
|
public static function getGenerator($name){
|
||||||
if(isset(Generator::$list[$name = strtolower($name)])){
|
if(isset(Generator::$list[$name = strtolower($name)])){
|
||||||
|
@ -32,15 +32,15 @@ use pocketmine\utils\Random;
|
|||||||
|
|
||||||
class GeneratorRegisterTask extends AsyncTask{
|
class GeneratorRegisterTask extends AsyncTask{
|
||||||
|
|
||||||
public $generator;
|
public $generatorClass;
|
||||||
public $settings;
|
public $settings;
|
||||||
public $seed;
|
public $seed;
|
||||||
public $levelId;
|
public $levelId;
|
||||||
public $worldHeight = Level::Y_MAX;
|
public $worldHeight = Level::Y_MAX;
|
||||||
|
|
||||||
public function __construct(Level $level, Generator $generator){
|
public function __construct(Level $level, string $generatorClass, array $generatorSettings = []){
|
||||||
$this->generator = get_class($generator);
|
$this->generatorClass = $generatorClass;
|
||||||
$this->settings = serialize($generator->getSettings());
|
$this->settings = serialize($generatorSettings);
|
||||||
$this->seed = $level->getSeed();
|
$this->seed = $level->getSeed();
|
||||||
$this->levelId = $level->getId();
|
$this->levelId = $level->getId();
|
||||||
$this->worldHeight = $level->getWorldHeight();
|
$this->worldHeight = $level->getWorldHeight();
|
||||||
@ -51,9 +51,9 @@ class GeneratorRegisterTask extends AsyncTask{
|
|||||||
Biome::init();
|
Biome::init();
|
||||||
$manager = new SimpleChunkManager($this->seed, $this->worldHeight);
|
$manager = new SimpleChunkManager($this->seed, $this->worldHeight);
|
||||||
$this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager);
|
$this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager);
|
||||||
|
|
||||||
/** @var Generator $generator */
|
/** @var Generator $generator */
|
||||||
$generator = $this->generator;
|
$generator = new $this->generatorClass(unserialize($this->settings));
|
||||||
$generator = new $generator(unserialize($this->settings));
|
|
||||||
$generator->init($manager, new Random($manager->getSeed()));
|
$generator->init($manager, new Random($manager->getSeed()));
|
||||||
$this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator);
|
$this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user