From 9e4d88a85260999dba49add87dc1c800aed75639 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sat, 6 Jun 2015 16:58:49 +0200 Subject: [PATCH] New extended packet timings --- src/pocketmine/Player.php | 55 ++++++++++++++++++++------------ src/pocketmine/event/Timings.php | 42 +++++++++++++++++++++--- 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index f4dd7cc65..633ffc17f 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -851,10 +851,11 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return false; } - Timings::$playerNetworkTimer->startTiming(); + $timings = Timings::getSendDataPacketTimings($packet); + $timings->startTiming(); $this->server->getPluginManager()->callEvent($ev = new DataPacketSendEvent($this, $packet)); if($ev->isCancelled()){ - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return false; } @@ -863,7 +864,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade } $this->batchedPackets[$packet->getChannel()][] = clone $packet; - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return true; } @@ -879,11 +880,13 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($this->connected === false){ return false; } - Timings::$playerNetworkTimer->startTiming(); + + $timings = Timings::getSendDataPacketTimings($packet); + $timings->startTiming(); $this->server->getPluginManager()->callEvent($ev = new DataPacketSendEvent($this, $packet)); if($ev->isCancelled()){ - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return false; } @@ -892,11 +895,11 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($needACK and $identifier !== null){ $this->needACK[$identifier] = false; - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return $identifier; } - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return true; } @@ -911,10 +914,11 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return false; } - Timings::$playerNetworkTimer->startTiming(); + $timings = Timings::getSendDataPacketTimings($packet); + $timings->startTiming(); $this->server->getPluginManager()->callEvent($ev = new DataPacketSendEvent($this, $packet)); if($ev->isCancelled()){ - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return false; } @@ -923,11 +927,11 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($needACK and $identifier !== null){ $this->needACK[$identifier] = false; - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return $identifier; } - Timings::$playerNetworkTimer->stopTiming(); + $timings->stopTiming(); return true; } @@ -1567,8 +1571,14 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return; } + + $timings = Timings::getReceiveDataPacketTimings($packet); + + $timings->startTiming(); + $this->server->getPluginManager()->callEvent($ev = new DataPacketReceiveEvent($this, $packet)); if($ev->isCancelled()){ + $timings->stopTiming(); return; } @@ -1588,7 +1598,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->uuid = Utils::dataToUUID($this->randomClientId, $this->iusername, $this->getAddress()); if(count($this->server->getOnlinePlayers()) > $this->server->getMaxPlayers() and $this->kick("disconnectionScreen.serverFull", false)){ - return; + break; } if($packet->protocol1 !== ProtocolInfo::CURRENT_PROTOCOL){ @@ -1607,18 +1617,18 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade } $this->close("", $message, false); - return; + break; } if(strpos($packet->username, "\x00") !== false or preg_match('#^[a-zA-Z0-9_]{3,16}$#', $packet->username) == 0 or $this->username === "" or $this->iusername === "rcon" or $this->iusername === "console" or strlen($packet->username) > 16 or strlen($packet->username) < 3){ $this->close("", "disconnectionScreen.invalidName"); - return; + break; } if(strlen($packet->skin) < 64 * 32 * 4){ $this->close("", "disconnectionScreen.invalidSkin"); - return; + break; } $this->setSkin($packet->skin, $packet->slim); @@ -1627,17 +1637,17 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($ev->isCancelled()){ $this->close("", $ev->getKickMessage()); - return; + break; } if(!$this->server->isWhitelisted(strtolower($this->getName()))){ $this->close($this->getLeaveMessage(), "Server is white-listed"); - return; + break; }elseif($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress())){ $this->close($this->getLeaveMessage(), "You are banned"); - return; + break; } if($this->hasPermission(Server::BROADCAST_CHANNEL_USERS)){ @@ -1652,6 +1662,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($p->kick("logged in from another location") === false){ $this->close($this->getLeaveMessage(), "Logged in from another location"); + $timings->stopTiming(); return; } } @@ -1685,7 +1696,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if(!($nbt instanceof Compound)){ $this->close($this->getLeaveMessage(), "Invalid data"); - return; + break; } $this->achievements = []; @@ -1704,7 +1715,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($ev->isCancelled()){ $this->close($this->getLeaveMessage(), $ev->getKickMessage()); - return; + break; } if($this->isCreative()){ @@ -2215,7 +2226,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($target instanceof DroppedItem or $target instanceof Arrow){ $this->kick("Attempting to attack an invalid entity"); $this->server->getLogger()->warning($this->getServer()->getLanguage()->translateString("pocketmine.player.invalidEntity", [$this->getName()])); - return; + break; } $item = $this->inventory->getItemInHand(); @@ -2730,6 +2741,8 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade default: break; } + + $timings->stopTiming(); } /** diff --git a/src/pocketmine/event/Timings.php b/src/pocketmine/event/Timings.php index 9800a9a63..57f129f7c 100644 --- a/src/pocketmine/event/Timings.php +++ b/src/pocketmine/event/Timings.php @@ -23,6 +23,7 @@ namespace pocketmine\event; use pocketmine\entity\Entity; +use pocketmine\network\protocol\DataPacket; use pocketmine\plugin\PluginManager; use pocketmine\scheduler\PluginTask; use pocketmine\scheduler\TaskHandler; @@ -41,6 +42,8 @@ abstract class Timings{ /** @var TimingsHandler */ public static $playerNetworkTimer; /** @var TimingsHandler */ + public static $playerNetworkReceiveTimer; + /** @var TimingsHandler */ public static $playerChunkOrderTimer; /** @var TimingsHandler */ public static $playerChunkSendTimer; @@ -104,6 +107,10 @@ abstract class Timings{ /** @var TimingsHandler[] */ public static $tileEntityTypeTimingMap = []; /** @var TimingsHandler[] */ + public static $packetReceiveTimingMap = []; + /** @var TimingsHandler[] */ + public static $packetSendTimingMap = []; + /** @var TimingsHandler[] */ public static $pluginTaskTimingMap = []; public static function init(){ @@ -115,7 +122,8 @@ abstract class Timings{ self::$memoryManagerTimer = new TimingsHandler("Memory Manager"); self::$garbageCollectorTimer = new TimingsHandler("Garbage Collector", self::$memoryManagerTimer); self::$playerListTimer = new TimingsHandler("Player List"); - self::$playerNetworkTimer = new TimingsHandler("Player Network"); + self::$playerNetworkTimer = new TimingsHandler("Player Network Send"); + self::$playerNetworkReceiveTimer = new TimingsHandler("Player Network Receive"); self::$playerChunkOrderTimer = new TimingsHandler("Player Order Chunks"); self::$playerChunkSendTimer = new TimingsHandler("Player Send Chunks"); self::$connectionTimer = new TimingsHandler("Connection Handler"); @@ -143,9 +151,6 @@ abstract class Timings{ self::$timerEntityAIMove = new TimingsHandler("** livingEntityAIMove"); self::$timerEntityTickRest = new TimingsHandler("** livingEntityTickRest"); - - PluginManager::$pluginParentTimer = new TimingsHandler("** Plugins"); - self::$schedulerSyncTimer = new TimingsHandler("** Scheduler - Sync Tasks", PluginManager::$pluginParentTimer); self::$schedulerAsyncTimer = new TimingsHandler("** Scheduler - Async Tasks"); @@ -214,4 +219,33 @@ abstract class Timings{ return self::$tileEntityTypeTimingMap[$tileType]; } + /** + * @param DataPacket $pk + * + * @return TimingsHandler + */ + public static function getReceiveDataPacketTimings(DataPacket $pk){ + if(!isset(self::$packetReceiveTimingMap[$pk::NETWORK_ID])){ + $pkName = (new \ReflectionClass($pk))->getShortName(); + self::$packetReceiveTimingMap[$pk::NETWORK_ID] = new TimingsHandler("** receivePacket - " . $pkName . " [0x" . dechex($pk::NETWORK_ID) . "]", self::$playerNetworkReceiveTimer); + } + + return self::$packetReceiveTimingMap[$pk::NETWORK_ID]; + } + + + /** + * @param DataPacket $pk + * + * @return TimingsHandler + */ + public static function getSendDataPacketTimings(DataPacket $pk){ + if(!isset(self::$packetSendTimingMap[$pk::NETWORK_ID])){ + $pkName = (new \ReflectionClass($pk))->getShortName(); + self::$packetSendTimingMap[$pk::NETWORK_ID] = new TimingsHandler("** sendPacket - " . $pkName . " [0x" . dechex($pk::NETWORK_ID) . "]", self::$playerNetworkTimer); + } + + return self::$packetSendTimingMap[$pk::NETWORK_ID]; + } + } \ No newline at end of file