From 413bd3c0df52e718abc6f649a60aebc6b2279f1c Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sat, 1 Nov 2014 22:12:35 +0100 Subject: [PATCH] Use SplFixedArray for improved performance --- src/pocketmine/block/Block.php | 256 +++++++++++---------- src/pocketmine/item/Item.php | 141 ++++++------ src/pocketmine/network/RakLibInterface.php | 12 +- 3 files changed, 208 insertions(+), 201 deletions(-) diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index 14270b854..50db91f34 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -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); } diff --git a/src/pocketmine/item/Item.php b/src/pocketmine/item/Item.php index 0018a57ec..ed2cf884b 100644 --- a/src/pocketmine/item/Item.php +++ b/src/pocketmine/item/Item.php @@ -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){ diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index 802fdfaac..c0632a483 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -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);