diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 17c2309c6..5c0692abc 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1877,7 +1877,7 @@ class Server{ if(empty($packets)){ throw new \InvalidArgumentException("Cannot send empty batch"); } - Timings::$playerNetworkTimer->startTiming(); + Timings::$playerNetworkSendCompressTimer->startTiming(); /** @var NetworkSession[] $targets */ $targets = []; @@ -1908,7 +1908,7 @@ class Server{ } } - Timings::$playerNetworkTimer->stopTiming(); + Timings::$playerNetworkSendCompressTimer->stopTiming(); } /** diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 993749b29..18fc3dfb9 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -146,21 +146,27 @@ class NetworkSession{ } if($this->cipher !== null){ + Timings::$playerNetworkReceiveDecryptTimer->startTiming(); try{ $payload = $this->cipher->decrypt($payload); }catch(\InvalidArgumentException $e){ $this->server->getLogger()->debug("Encrypted packet from " . $this->ip . " " . $this->port . ": " . bin2hex($payload)); $this->disconnect("Packet decryption error: " . $e->getMessage()); return; + }finally{ + Timings::$playerNetworkReceiveDecryptTimer->stopTiming(); } } + Timings::$playerNetworkReceiveDecompressTimer->startTiming(); try{ $stream = new PacketStream(NetworkCompression::decompress($payload)); }catch(\ErrorException $e){ $this->server->getLogger()->debug("Failed to decompress packet from " . $this->ip . " " . $this->port . ": " . bin2hex($payload)); $this->disconnect("Compressed packet batch decode error (incompatible game version?)", false); return; + }finally{ + Timings::$playerNetworkReceiveDecompressTimer->stopTiming(); } while(!$stream->feof() and $this->connected){ @@ -206,7 +212,9 @@ class NetworkSession{ public function sendEncoded(string $payload, bool $immediate = false) : void{ if($this->cipher !== null){ + Timings::$playerNetworkSendEncryptTimer->startTiming(); $payload = $this->cipher->encrypt($payload); + Timings::$playerNetworkSendEncryptTimer->stopTiming(); } $this->interface->putPacket($this, $payload, $immediate); } diff --git a/src/pocketmine/timings/Timings.php b/src/pocketmine/timings/Timings.php index 91df09a92..86e7f793f 100644 --- a/src/pocketmine/timings/Timings.php +++ b/src/pocketmine/timings/Timings.php @@ -42,10 +42,18 @@ abstract class Timings{ /** @var TimingsHandler */ public static $titleTickTimer; /** @var TimingsHandler */ - public static $playerNetworkTimer; + public static $playerNetworkSendTimer; + /** @var TimingsHandler */ + public static $playerNetworkSendCompressTimer; + /** @var TimingsHandler */ + public static $playerNetworkSendEncryptTimer; /** @var TimingsHandler */ public static $playerNetworkReceiveTimer; /** @var TimingsHandler */ + public static $playerNetworkReceiveDecompressTimer; + /** @var TimingsHandler */ + public static $playerNetworkReceiveDecryptTimer; + /** @var TimingsHandler */ public static $playerChunkOrderTimer; /** @var TimingsHandler */ public static $playerChunkSendTimer; @@ -112,8 +120,15 @@ abstract class Timings{ self::$memoryManagerTimer = new TimingsHandler("Memory Manager"); self::$garbageCollectorTimer = new TimingsHandler("Garbage Collector", self::$memoryManagerTimer); self::$titleTickTimer = new TimingsHandler("Console Title Tick"); - self::$playerNetworkTimer = new TimingsHandler("Player Network Send"); + + self::$playerNetworkSendTimer = new TimingsHandler("Player Network Send"); + self::$playerNetworkSendCompressTimer = new TimingsHandler("** Player Network Send - Compression", self::$playerNetworkSendTimer); + self::$playerNetworkSendEncryptTimer = new TimingsHandler("** Player Network Send - Encryption", self::$playerNetworkSendTimer); + self::$playerNetworkReceiveTimer = new TimingsHandler("Player Network Receive"); + self::$playerNetworkReceiveDecompressTimer = new TimingsHandler("** Player Network Receive - Decompression", self::$playerNetworkReceiveTimer); + self::$playerNetworkReceiveDecryptTimer = new TimingsHandler("** Player Network Receive - Decryption", self::$playerNetworkReceiveTimer); + self::$playerChunkOrderTimer = new TimingsHandler("Player Order Chunks"); self::$playerChunkSendTimer = new TimingsHandler("Player Send Chunks"); self::$connectionTimer = new TimingsHandler("Connection Handler"); @@ -218,7 +233,7 @@ abstract class Timings{ public static function getSendDataPacketTimings(DataPacket $pk) : TimingsHandler{ 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); + self::$packetSendTimingMap[$pk::NETWORK_ID] = new TimingsHandler("** sendPacket - " . $pkName . " [0x" . dechex($pk::NETWORK_ID) . "]", self::$playerNetworkSendTimer); } return self::$packetSendTimingMap[$pk::NETWORK_ID];