Use SplFixedArray for improved performance

This commit is contained in:
Shoghi Cervantes 2014-11-01 22:12:35 +01:00
parent 1a0428654b
commit 413bd3c0df
3 changed files with 208 additions and 201 deletions

View File

@ -505,8 +505,8 @@ class Block extends Position implements Metadatable{
];
/** @var Block[] */
public static $list = [];
/** @var \SplFixedArray */
public static $list = null;
protected $id;
protected $meta;
protected $name = "Unknown";
@ -532,145 +532,145 @@ class Block extends Position implements Metadatable{
protected $boundingBox = null;
public static function init(){
if(count(self::$list) === 0){
self::$list = [
self::AIR => Air::class,
self::STONE => Stone::class,
self::GRASS => Grass::class,
self::DIRT => Dirt::class,
self::COBBLESTONE => Cobblestone::class,
self::PLANKS => Planks::class,
self::SAPLING => Sapling::class,
self::BEDROCK => Bedrock::class,
self::WATER => Water::class,
self::STILL_WATER => StillWater::class,
self::LAVA => Lava::class,
self::STILL_LAVA => StillLava::class,
self::SAND => Sand::class,
self::GRAVEL => Gravel::class,
self::GOLD_ORE => GoldOre::class,
self::IRON_ORE => IronOre::class,
self::COAL_ORE => CoalOre::class,
self::WOOD => Wood::class,
self::LEAVES => Leaves::class,
self::SPONGE => Sponge::class,
self::GLASS => Glass::class,
self::LAPIS_ORE => LapisOre::class,
self::LAPIS_BLOCK => Lapis::class,
self::SANDSTONE => Sandstone::class,
self::BED_BLOCK => Bed::class,
self::COBWEB => Cobweb::class,
self::TALL_GRASS => TallGrass::class,
self::DEAD_BUSH => DeadBush::class,
self::WOOL => Wool::class,
self::DANDELION => Dandelion::class,
self::POPPY => CyanFlower::class,
self::BROWN_MUSHROOM => BrownMushroom::class,
self::RED_MUSHROOM => RedMushroom::class,
self::GOLD_BLOCK => Gold::class,
self::IRON_BLOCK => Iron::class,
self::DOUBLE_SLAB => DoubleSlab::class,
self::SLAB => Slab::class,
self::BRICKS_BLOCK => Bricks::class,
self::TNT => TNT::class,
self::BOOKSHELF => Bookshelf::class,
self::MOSS_STONE => MossStone::class,
self::OBSIDIAN => Obsidian::class,
self::TORCH => Torch::class,
self::FIRE => Fire::class,
self::MONSTER_SPAWNER => MonsterSpawner::class,
self::WOOD_STAIRS => WoodStairs::class,
self::CHEST => Chest::class,
if(self::$list === null){
self::$list = new \SplFixedArray(256);
self::$list[self::AIR] = Air::class;;
self::$list[self::STONE] = Stone::class;;
self::$list[self::GRASS] = Grass::class;;
self::$list[self::DIRT] = Dirt::class;;
self::$list[self::COBBLESTONE] = Cobblestone::class;;
self::$list[self::PLANKS] = Planks::class;;
self::$list[self::SAPLING] = Sapling::class;;
self::$list[self::BEDROCK] = Bedrock::class;;
self::$list[self::WATER] = Water::class;;
self::$list[self::STILL_WATER] = StillWater::class;;
self::$list[self::LAVA] = Lava::class;;
self::$list[self::STILL_LAVA] = StillLava::class;;
self::$list[self::SAND] = Sand::class;;
self::$list[self::GRAVEL] = Gravel::class;;
self::$list[self::GOLD_ORE] = GoldOre::class;;
self::$list[self::IRON_ORE] = IronOre::class;;
self::$list[self::COAL_ORE] = CoalOre::class;;
self::$list[self::WOOD] = Wood::class;;
self::$list[self::LEAVES] = Leaves::class;;
self::$list[self::SPONGE] = Sponge::class;;
self::$list[self::GLASS] = Glass::class;;
self::$list[self::LAPIS_ORE] = LapisOre::class;;
self::$list[self::LAPIS_BLOCK] = Lapis::class;;
self::$list[self::SANDSTONE] = Sandstone::class;;
self::$list[self::BED_BLOCK] = Bed::class;;
self::$list[self::COBWEB] = Cobweb::class;;
self::$list[self::TALL_GRASS] = TallGrass::class;;
self::$list[self::DEAD_BUSH] = DeadBush::class;;
self::$list[self::WOOL] = Wool::class;;
self::$list[self::DANDELION] = Dandelion::class;;
self::$list[self::POPPY] = CyanFlower::class;;
self::$list[self::BROWN_MUSHROOM] = BrownMushroom::class;;
self::$list[self::RED_MUSHROOM] = RedMushroom::class;;
self::$list[self::GOLD_BLOCK] = Gold::class;;
self::$list[self::IRON_BLOCK] = Iron::class;;
self::$list[self::DOUBLE_SLAB] = DoubleSlab::class;;
self::$list[self::SLAB] = Slab::class;;
self::$list[self::BRICKS_BLOCK] = Bricks::class;;
self::$list[self::TNT] = TNT::class;;
self::$list[self::BOOKSHELF] = Bookshelf::class;;
self::$list[self::MOSS_STONE] = MossStone::class;;
self::$list[self::OBSIDIAN] = Obsidian::class;;
self::$list[self::TORCH] = Torch::class;;
self::$list[self::FIRE] = Fire::class;;
self::$list[self::MONSTER_SPAWNER] = MonsterSpawner::class;;
self::$list[self::WOOD_STAIRS] = WoodStairs::class;;
self::$list[self::CHEST] = Chest::class;;
self::DIAMOND_ORE => DiamondOre::class,
self::DIAMOND_BLOCK => Diamond::class,
self::WORKBENCH => Workbench::class,
self::WHEAT_BLOCK => Wheat::class,
self::FARMLAND => Farmland::class,
self::FURNACE => Furnace::class,
self::BURNING_FURNACE => BurningFurnace::class,
self::SIGN_POST => SignPost::class,
self::WOOD_DOOR_BLOCK => WoodDoor::class,
self::LADDER => Ladder::class,
self::$list[self::DIAMOND_ORE] = DiamondOre::class;;
self::$list[self::DIAMOND_BLOCK] = Diamond::class;;
self::$list[self::WORKBENCH] = Workbench::class;;
self::$list[self::WHEAT_BLOCK] = Wheat::class;;
self::$list[self::FARMLAND] = Farmland::class;;
self::$list[self::FURNACE] = Furnace::class;;
self::$list[self::BURNING_FURNACE] = BurningFurnace::class;;
self::$list[self::SIGN_POST] = SignPost::class;;
self::$list[self::WOOD_DOOR_BLOCK] = WoodDoor::class;;
self::$list[self::LADDER] = Ladder::class;;
self::COBBLESTONE_STAIRS => CobblestoneStairs::class,
self::WALL_SIGN => WallSign::class,
self::$list[self::COBBLESTONE_STAIRS] = CobblestoneStairs::class;;
self::$list[self::WALL_SIGN] = WallSign::class;;
self::IRON_DOOR_BLOCK => IronDoor::class,
self::REDSTONE_ORE => RedstoneOre::class,
self::GLOWING_REDSTONE_ORE => GlowingRedstoneOre::class,
self::$list[self::IRON_DOOR_BLOCK] = IronDoor::class;;
self::$list[self::REDSTONE_ORE] = RedstoneOre::class;;
self::$list[self::GLOWING_REDSTONE_ORE] = GlowingRedstoneOre::class;;
self::SNOW_LAYER => SnowLayer::class,
self::ICE => Ice::class,
self::SNOW_BLOCK => Snow::class,
self::CACTUS => Cactus::class,
self::CLAY_BLOCK => Clay::class,
self::SUGARCANE_BLOCK => Sugarcane::class,
self::$list[self::SNOW_LAYER] = SnowLayer::class;;
self::$list[self::ICE] = Ice::class;;
self::$list[self::SNOW_BLOCK] = Snow::class;;
self::$list[self::CACTUS] = Cactus::class;;
self::$list[self::CLAY_BLOCK] = Clay::class;;
self::$list[self::SUGARCANE_BLOCK] = Sugarcane::class;;
self::FENCE => Fence::class,
self::PUMPKIN => Pumpkin::class,
self::NETHERRACK => Netherrack::class,
self::SOUL_SAND => SoulSand::class,
self::GLOWSTONE_BLOCK => Glowstone::class,
self::$list[self::FENCE] = Fence::class;;
self::$list[self::PUMPKIN] = Pumpkin::class;;
self::$list[self::NETHERRACK] = Netherrack::class;;
self::$list[self::SOUL_SAND] = SoulSand::class;;
self::$list[self::GLOWSTONE_BLOCK] = Glowstone::class;;
self::LIT_PUMPKIN => LitPumpkin::class,
self::CAKE_BLOCK => Cake::class,
self::$list[self::LIT_PUMPKIN] = LitPumpkin::class;;
self::$list[self::CAKE_BLOCK] = Cake::class;;
self::TRAPDOOR => Trapdoor::class,
self::$list[self::TRAPDOOR] = Trapdoor::class;;
self::STONE_BRICKS => StoneBricks::class,
self::$list[self::STONE_BRICKS] = StoneBricks::class;;
self::IRON_BARS => IronBars::class,
self::GLASS_PANE => GlassPane::class,
self::MELON_BLOCK => Melon::class,
self::PUMPKIN_STEM => PumpkinStem::class,
self::MELON_STEM => MelonStem::class,
self::VINE => Vine::class,
self::FENCE_GATE => FenceGate::class,
self::BRICK_STAIRS => BrickStairs::class,
self::STONE_BRICK_STAIRS => StoneBrickStairs::class,
self::$list[self::IRON_BARS] = IronBars::class;;
self::$list[self::GLASS_PANE] = GlassPane::class;;
self::$list[self::MELON_BLOCK] = Melon::class;;
self::$list[self::PUMPKIN_STEM] = PumpkinStem::class;;
self::$list[self::MELON_STEM] = MelonStem::class;;
self::$list[self::VINE] = Vine::class;;
self::$list[self::FENCE_GATE] = FenceGate::class;;
self::$list[self::BRICK_STAIRS] = BrickStairs::class;;
self::$list[self::STONE_BRICK_STAIRS] = StoneBrickStairs::class;;
self::MYCELIUM => Mycelium::class,
self::NETHER_BRICKS => NetherBrick::class,
self::$list[self::MYCELIUM] = Mycelium::class;;
self::$list[self::NETHER_BRICKS] = NetherBrick::class;;
self::NETHER_BRICKS_STAIRS => NetherBrickStairs::class,
self::$list[self::NETHER_BRICKS_STAIRS] = NetherBrickStairs::class;;
self::END_PORTAL => EndPortal::class,
self::END_STONE => EndStone::class,
self::SANDSTONE_STAIRS => SandstoneStairs::class,
self::EMERALD_ORE => EmeraldOre::class,
self::$list[self::END_PORTAL] = EndPortal::class;;
self::$list[self::END_STONE] = EndStone::class;;
self::$list[self::SANDSTONE_STAIRS] = SandstoneStairs::class;;
self::$list[self::EMERALD_ORE] = EmeraldOre::class;;
self::EMERALD_BLOCK => Emerald::class,
self::SPRUCE_WOOD_STAIRS => SpruceWoodStairs::class,
self::BIRCH_WOOD_STAIRS => BirchWoodStairs::class,
self::JUNGLE_WOOD_STAIRS => JungleWoodStairs::class,
self::STONE_WALL => StoneWall::class,
self::$list[self::EMERALD_BLOCK] = Emerald::class;;
self::$list[self::SPRUCE_WOOD_STAIRS] = SpruceWoodStairs::class;;
self::$list[self::BIRCH_WOOD_STAIRS] = BirchWoodStairs::class;;
self::$list[self::JUNGLE_WOOD_STAIRS] = JungleWoodStairs::class;;
self::$list[self::STONE_WALL] = StoneWall::class;;
self::CARROT_BLOCK => Carrot::class,
self::POTATO_BLOCK => Potato::class,
self::$list[self::CARROT_BLOCK] = Carrot::class;;
self::$list[self::POTATO_BLOCK] = Potato::class;;
self::QUARTZ_BLOCK => Quartz::class,
self::QUARTZ_STAIRS => QuartzStairs::class,
self::DOUBLE_WOOD_SLAB => DoubleWoodSlab::class,
self::WOOD_SLAB => WoodSlab::class,
self::STAINED_CLAY => StainedClay::class,
self::$list[self::QUARTZ_BLOCK] = Quartz::class;;
self::$list[self::QUARTZ_STAIRS] = QuartzStairs::class;;
self::$list[self::DOUBLE_WOOD_SLAB] = DoubleWoodSlab::class;;
self::$list[self::WOOD_SLAB] = WoodSlab::class;;
self::$list[self::STAINED_CLAY] = StainedClay::class;;
self::LEAVES2 => Leaves2::class,
self::WOOD2 => Wood2::class,
self::ACACIA_WOOD_STAIRS => AcaciaWoodStairs::class,
self::DARK_OAK_WOOD_STAIRS => DarkOakWoodStairs::class,
self::$list[self::LEAVES2] = Leaves2::class;;
self::$list[self::WOOD2] = Wood2::class;;
self::$list[self::ACACIA_WOOD_STAIRS] = AcaciaWoodStairs::class;;
self::$list[self::DARK_OAK_WOOD_STAIRS] = DarkOakWoodStairs::class;;
self::HAY_BALE => HayBale::class,
self::CARPET => Carpet::class,
self::HARDENED_CLAY => HardenedClay::class,
self::COAL_BLOCK => Coal::class,
self::$list[self::HAY_BALE] = HayBale::class;;
self::$list[self::CARPET] = Carpet::class;;
self::$list[self::HARDENED_CLAY] = HardenedClay::class;;
self::$list[self::COAL_BLOCK] = Coal::class;;
self::$list[self::PODZOL] = Podzol::class;;
self::$list[self::BEETROOT_BLOCK] = Beetroot::class;;
self::$list[self::STONECUTTER] = Stonecutter::class;;
self::$list[self::GLOWING_OBSIDIAN] = GlowingObsidian::class;;
self::$list[self::NETHER_REACTOR] = NetherReactor::class;;
self::PODZOL => Podzol::class,
self::BEETROOT_BLOCK => Beetroot::class,
self::STONECUTTER => Stonecutter::class,
self::GLOWING_OBSIDIAN => GlowingObsidian::class,
self::NETHER_REACTOR => NetherReactor::class,
];
}
}
@ -682,10 +682,14 @@ class Block extends Position implements Metadatable{
* @return Block
*/
public static function get($id, $meta = 0, Position $pos = null){
if(isset(self::$list[$id])){
try{
$block = self::$list[$id];
$block = new $block($meta);
}else{
if($block !== null){
$block = new $block($meta);
}else{
$block = new Block($id, $meta);
}
}catch(\RuntimeException $e){
$block = new Block($id, $meta);
}

View File

@ -379,8 +379,8 @@ class Item{
const BEETROOT_SOUP = 459;
/** @var Item[] */
public static $list = [];
/** @var \SplFixedArray */
public static $list = null;
protected $block;
protected $id;
protected $meta;
@ -391,83 +391,84 @@ class Item{
public $isActivable = false;
public static function init(){
if(count(self::$list) === 0){
self::$list = [
self::SUGARCANE => Sugarcane::class,
self::WHEAT_SEEDS => WheatSeeds::class,
self::PUMPKIN_SEEDS => PumpkinSeeds::class,
self::MELON_SEEDS => MelonSeeds::class,
self::MUSHROOM_STEW => MushroomStew::class,
self::BEETROOT_SOUP => BeetrootSoup::class,
self::CARROT => Carrot::class,
self::POTATO => Potato::class,
self::BEETROOT_SEEDS => BeetrootSeeds::class,
self::SIGN => Sign::class,
self::WOODEN_DOOR => WoodenDoor::class,
self::BUCKET => Bucket::class,
self::IRON_DOOR => IronDoor::class,
self::CAKE => Cake::class,
self::BED => Bed::class,
self::PAINTING => Painting::class,
self::COAL => Coal::class,
self::APPLE => Apple::class,
self::SPAWN_EGG => SpawnEgg::class,
self::DIAMOND => Diamond::class,
self::STICK => Stick::class,
self::BOWL => Bowl::class,
self::FEATHER => Feather::class,
self::BRICK => Brick::class,
self::IRON_SWORD => IronSword::class,
self::IRON_INGOT => IronIngot::class,
self::GOLD_INGOT => GoldIngot::class,
self::IRON_SHOVEL => IronShovel::class,
self::IRON_PICKAXE => IronPickaxe::class,
self::IRON_AXE => IronAxe::class,
self::IRON_HOE => IronHoe::class,
self::DIAMOND_SWORD => DiamondSword::class,
self::DIAMOND_SHOVEL => DiamondShovel::class,
self::DIAMOND_PICKAXE => DiamondPickaxe::class,
self::DIAMOND_AXE => DiamondAxe::class,
self::DIAMOND_HOE => DiamondHoe::class,
self::GOLD_SWORD => GoldSword::class,
self::GOLD_SHOVEL => GoldShovel::class,
self::GOLD_PICKAXE => GoldPickaxe::class,
self::GOLD_AXE => GoldAxe::class,
self::GOLD_HOE => GoldHoe::class,
self::STONE_SWORD => StoneSword::class,
self::STONE_SHOVEL => StoneShovel::class,
self::STONE_PICKAXE => StonePickaxe::class,
self::STONE_AXE => StoneAxe::class,
self::STONE_HOE => StoneHoe::class,
self::WOODEN_SWORD => WoodenSword::class,
self::WOODEN_SHOVEL => WoodenShovel::class,
self::WOODEN_PICKAXE => WoodenPickaxe::class,
self::WOODEN_AXE => WoodenAxe::class,
self::WOODEN_HOE => WoodenHoe::class,
self::FLINT_STEEL => FlintSteel::class,
self::SHEARS => Shears::class,
self::BOW => Bow::class,
];
foreach(Block::$list as $id => $class){
self::$list[$id] = $class;
}
if(self::$list === null){
self::$list = new \SplFixedArray(65536);
self::$list[self::SUGARCANE] = Sugarcane::class;;
self::$list[self::WHEAT_SEEDS] = WheatSeeds::class;;
self::$list[self::PUMPKIN_SEEDS] = PumpkinSeeds::class;;
self::$list[self::MELON_SEEDS] = MelonSeeds::class;;
self::$list[self::MUSHROOM_STEW] = MushroomStew::class;;
self::$list[self::BEETROOT_SOUP] = BeetrootSoup::class;;
self::$list[self::CARROT] = Carrot::class;;
self::$list[self::POTATO] = Potato::class;;
self::$list[self::BEETROOT_SEEDS] = BeetrootSeeds::class;;
self::$list[self::SIGN] = Sign::class;;
self::$list[self::WOODEN_DOOR] = WoodenDoor::class;;
self::$list[self::BUCKET] = Bucket::class;;
self::$list[self::IRON_DOOR] = IronDoor::class;;
self::$list[self::CAKE] = Cake::class;;
self::$list[self::BED] = Bed::class;;
self::$list[self::PAINTING] = Painting::class;;
self::$list[self::COAL] = Coal::class;;
self::$list[self::APPLE] = Apple::class;;
self::$list[self::SPAWN_EGG] = SpawnEgg::class;;
self::$list[self::DIAMOND] = Diamond::class;;
self::$list[self::STICK] = Stick::class;;
self::$list[self::BOWL] = Bowl::class;;
self::$list[self::FEATHER] = Feather::class;;
self::$list[self::BRICK] = Brick::class;;
self::$list[self::IRON_SWORD] = IronSword::class;;
self::$list[self::IRON_INGOT] = IronIngot::class;;
self::$list[self::GOLD_INGOT] = GoldIngot::class;;
self::$list[self::IRON_SHOVEL] = IronShovel::class;;
self::$list[self::IRON_PICKAXE] = IronPickaxe::class;;
self::$list[self::IRON_AXE] = IronAxe::class;;
self::$list[self::IRON_HOE] = IronHoe::class;;
self::$list[self::DIAMOND_SWORD] = DiamondSword::class;;
self::$list[self::DIAMOND_SHOVEL] = DiamondShovel::class;;
self::$list[self::DIAMOND_PICKAXE] = DiamondPickaxe::class;;
self::$list[self::DIAMOND_AXE] = DiamondAxe::class;;
self::$list[self::DIAMOND_HOE] = DiamondHoe::class;;
self::$list[self::GOLD_SWORD] = GoldSword::class;;
self::$list[self::GOLD_SHOVEL] = GoldShovel::class;;
self::$list[self::GOLD_PICKAXE] = GoldPickaxe::class;;
self::$list[self::GOLD_AXE] = GoldAxe::class;;
self::$list[self::GOLD_HOE] = GoldHoe::class;;
self::$list[self::STONE_SWORD] = StoneSword::class;;
self::$list[self::STONE_SHOVEL] = StoneShovel::class;;
self::$list[self::STONE_PICKAXE] = StonePickaxe::class;;
self::$list[self::STONE_AXE] = StoneAxe::class;;
self::$list[self::STONE_HOE] = StoneHoe::class;;
self::$list[self::WOODEN_SWORD] = WoodenSword::class;;
self::$list[self::WOODEN_SHOVEL] = WoodenShovel::class;;
self::$list[self::WOODEN_PICKAXE] = WoodenPickaxe::class;;
self::$list[self::WOODEN_AXE] = WoodenAxe::class;;
self::$list[self::WOODEN_HOE] = WoodenHoe::class;;
self::$list[self::FLINT_STEEL] = FlintSteel::class;;
self::$list[self::SHEARS] = Shears::class;;
self::$list[self::BOW] = Bow::class;;
for($i = 0; $i < 256; ++$i){
if(Block::$list[$i] !== null){
self::$list[$i] = Block::$list[$i];
}
}
}
}
public static function get($id, $meta = 0, $count = 1){
if(isset(self::$list[$id])){
try{
$class = self::$list[$id];
if($id < 256){
$item = new ItemBlock(new $class($meta), $meta, $count);
if($class === null){
return new Item($id, $meta, $count);
}elseif($id < 256){
return new ItemBlock(new $class($meta), $meta, $count);
}else{
$item = new $class($meta, $count);
return new $class($meta, $count);
}
}else{
$item = new Item($id, $meta, $count);
}catch(\RuntimeException $e){
return new Item($id, $meta, $count);
}
return $item;
}
public static function fromString($str, $multiple = false){

View File

@ -84,7 +84,8 @@ use raklib\server\ServerInstance;
class RakLibInterface implements ServerInstance, SourceInterface{
private $packetPool = [];
/** @var \SplFixedArray */
private $packetPool;
private $server;
/** @var Player[] */
@ -271,16 +272,17 @@ class RakLibInterface implements ServerInstance, SourceInterface{
* @return DataPacket
*/
public function getPacketFromPool($id){
if(isset($this->packetPool[$id])){
/** @var DataPacket $class */
$class = $this->packetPool[$id];
/** @var DataPacket $class */
$class = $this->packetPool[$id];
if($class !== null){
return new $class;
}
return null;
}
private function registerPackets(){
$this->packetPool = new \SplFixedArray(256);
$this->registerPacket(ProtocolInfo::LOGIN_PACKET, LoginPacket::class);
$this->registerPacket(ProtocolInfo::LOGIN_STATUS_PACKET, LoginStatusPacket::class);
$this->registerPacket(ProtocolInfo::MESSAGE_PACKET, MessagePacket::class);