New generic in-memory chunk format, fixed 0.17.0.1 chunk loading

Terrible performance, needs profiling. TODO: fix this.
This commit is contained in:
Dylan K. Taylor
2016-11-17 16:15:06 +00:00
parent 60260a294b
commit 4c49db6036
44 changed files with 1895 additions and 2812 deletions

View File

@ -31,7 +31,7 @@ use pocketmine\block\LapisOre;
use pocketmine\block\RedstoneOre;
use pocketmine\item\Item;
use pocketmine\level\ChunkManager;
use pocketmine\level\format\FullChunk;
use pocketmine\level\format\Chunk;
use pocketmine\level\generator\biome\Biome;
use pocketmine\level\generator\populator\Ore;
use pocketmine\level\generator\populator\Populator;
@ -41,7 +41,7 @@ use pocketmine\utils\Random;
class Flat extends Generator{
/** @var ChunkManager */
private $level;
/** @var FullChunk */
/** @var Chunk */
private $chunk;
/** @var Random */
private $random;

View File

@ -21,7 +21,8 @@
namespace pocketmine\level\generator;
use pocketmine\level\format\FullChunk;
use pocketmine\level\format\Chunk;
use pocketmine\level\format\generic\GenericChunk;
use pocketmine\level\Level;
use pocketmine\level\SimpleChunkManager;
use pocketmine\scheduler\AsyncTask;
@ -34,10 +35,10 @@ class GenerationTask extends AsyncTask{
public $chunk;
public $chunkClass;
public function __construct(Level $level, FullChunk $chunk){
public function __construct(Level $level, Chunk $chunk){
$this->state = true;
$this->levelId = $level->getId();
$this->chunk = $chunk->toFastBinary();
$this->chunk = GenericChunk::fastSerialize($chunk);
$this->chunkClass = get_class($chunk);
}
@ -51,9 +52,9 @@ class GenerationTask extends AsyncTask{
return;
}
/** @var FullChunk $chunk */
/** @var Chunk $chunk */
$chunk = $this->chunkClass;
$chunk = $chunk::fromFastBinary($this->chunk);
$chunk = GenericChunk::fastDeserialize($this->chunk);
if($chunk === null){
//TODO error
return;
@ -65,7 +66,7 @@ class GenerationTask extends AsyncTask{
$chunk = $manager->getChunk($chunk->getX(), $chunk->getZ());
$chunk->setGenerated();
$this->chunk = $chunk->toFastBinary();
$this->chunk = GenericChunk::fastSerialize($chunk);
$manager->setChunk($chunk->getX(), $chunk->getZ(), null);
}
@ -77,9 +78,9 @@ class GenerationTask extends AsyncTask{
$level->registerGenerator();
return;
}
/** @var FullChunk $chunk */
/** @var Chunk $chunk */
$chunk = $this->chunkClass;
$chunk = $chunk::fromFastBinary($this->chunk, $level->getProvider());
$chunk = GenericChunk::fastDeserialize($this->chunk, $level->getProvider());
if($chunk === null){
//TODO error
return;

View File

@ -21,7 +21,8 @@
namespace pocketmine\level\generator;
use pocketmine\level\format\FullChunk;
use pocketmine\level\format\Chunk;
use pocketmine\level\format\generic\FullChunk;
use pocketmine\level\Level;
use pocketmine\scheduler\AsyncTask;
use pocketmine\Server;
@ -32,16 +33,16 @@ class LightPopulationTask extends AsyncTask{
public $chunk;
public $chunkClass;
public function __construct(Level $level, FullChunk $chunk){
public function __construct(Level $level, Chunk $chunk){
$this->levelId = $level->getId();
$this->chunk = $chunk->toFastBinary();
$this->chunk = GenericChunk::fastDeserialize($this->chunk);
$this->chunkClass = get_class($chunk);
}
public function onRun(){
/** @var FullChunk $chunk */
/** @var Chunk $chunk */
$chunk = $this->chunkClass;
$chunk = $chunk::fromFastBinary($this->chunk);
$chunk = GenericChunk::fastDeserialize($this->chunk);
if($chunk === null){
//TODO error
return;
@ -51,15 +52,15 @@ class LightPopulationTask extends AsyncTask{
$chunk->populateSkyLight();
$chunk->setLightPopulated();
$this->chunk = $chunk->toFastBinary();
$this->chunk = GenericChunk::fastSerialize($chunk);
}
public function onCompletion(Server $server){
$level = $server->getLevel($this->levelId);
if($level !== null){
/** @var FullChunk $chunk */
/** @var Chunk $chunk */
$chunk = $this->chunkClass;
$chunk = $chunk::fromFastBinary($this->chunk, $level->getProvider());
$chunk = GenericChunk::fastDeserialize($this->chunk, $level->getProvider());
if($chunk === null){
//TODO error
return;

View File

@ -21,7 +21,8 @@
namespace pocketmine\level\generator;
use pocketmine\level\format\FullChunk;
use pocketmine\level\format\Chunk;
use pocketmine\level\format\generic\GenericChunk;
use pocketmine\level\Level;
use pocketmine\level\SimpleChunkManager;
use pocketmine\scheduler\AsyncTask;
@ -29,11 +30,9 @@ use pocketmine\Server;
class PopulationTask extends AsyncTask{
public $state;
public $levelId;
public $chunk;
public $chunkClass;
public $chunk0;
public $chunk1;
@ -45,11 +44,10 @@ class PopulationTask extends AsyncTask{
public $chunk7;
public $chunk8;
public function __construct(Level $level, FullChunk $chunk){
public function __construct(Level $level, Chunk $chunk){
$this->state = true;
$this->levelId = $level->getId();
$this->chunk = $chunk->toFastBinary();
$this->chunkClass = get_class($chunk);
$this->chunk = GenericChunk::fastSerialize($chunk);
for($i = 0; $i < 9; ++$i){
if($i === 4){
@ -58,7 +56,7 @@ class PopulationTask extends AsyncTask{
$xx = -1 + $i % 3;
$zz = -1 + (int) ($i / 3);
$ck = $level->getChunk($chunk->getX() + $xx, $chunk->getZ() + $zz, false);
$this->{"chunk$i"} = $ck !== null ? $ck->toFastBinary() : null;
$this->{"chunk$i"} = $ck !== null ? GenericChunk::fastSerialize($ck) : null;
}
}
@ -72,12 +70,10 @@ class PopulationTask extends AsyncTask{
return;
}
/** @var FullChunk[] $chunks */
/** @var Chunk[] $chunks */
$chunks = [];
/** @var FullChunk $chunkC */
$chunkC = $this->chunkClass;
$chunk = $chunkC::fromFastBinary($this->chunk);
$chunk = GenericChunk::fastDeserialize($this->chunk);
for($i = 0; $i < 9; ++$i){
if($i === 4){
@ -87,9 +83,9 @@ class PopulationTask extends AsyncTask{
$zz = -1 + (int) ($i / 3);
$ck = $this->{"chunk$i"};
if($ck === null){
$chunks[$i] = $chunkC::getEmptyChunk($chunk->getX() + $xx, $chunk->getZ() + $zz);
$chunks[$i] = GenericChunk::getEmptyChunk($chunk->getX() + $xx, $chunk->getZ() + $zz);
}else{
$chunks[$i] = $chunkC::fromFastBinary($ck);
$chunks[$i] = GenericChunk::fastDeserialize($ck);
}
}
@ -122,7 +118,7 @@ class PopulationTask extends AsyncTask{
$chunk->populateSkyLight();
$chunk->setLightPopulated();
$chunk->setPopulated();
$this->chunk = $chunk->toFastBinary();
$this->chunk = GenericChunk::fastSerialize($chunk);
$manager->setChunk($chunk->getX(), $chunk->getZ(), null);
@ -145,7 +141,7 @@ class PopulationTask extends AsyncTask{
continue;
}
$this->{"chunk$i"} = $chunks[$i] !== null ? $chunks[$i]->toFastBinary() : null;
$this->{"chunk$i"} = $chunks[$i] !== null ? GenericChunk::fastSerialize($chunks[$i]) : null;
}
}
@ -157,10 +153,7 @@ class PopulationTask extends AsyncTask{
return;
}
/** @var FullChunk $chunkC */
$chunkC = $this->chunkClass;
$chunk = $chunkC::fromFastBinary($this->chunk, $level->getProvider());
$chunk = GenericChunk::fastDeserialize($this->chunk, $level->getProvider());
if($chunk === null){
//TODO error
@ -173,7 +166,7 @@ class PopulationTask extends AsyncTask{
}
$c = $this->{"chunk$i"};
if($c !== null){
$c = $chunkC::fromFastBinary($c, $level->getProvider());
$c = GenericChunk::fastDeserialize($c, $level->getProvider());
$level->generateChunkCallback($c->getX(), $c->getZ(), $c);
}
}