From 31089ce3b2bb5d717db379b2531f8ea2fb9da04c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 12 Nov 2020 17:53:07 +0000 Subject: [PATCH] Timings: added broadcastPackets timer the body of this function is potentially very expensive and isn't currently recorded by any timer. --- src/Server.php | 80 +++++++++++++++++++++-------------------- src/timings/Timings.php | 5 +++ 2 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/Server.php b/src/Server.php index a35c66a20..c04685877 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1182,54 +1182,56 @@ class Server{ throw new \InvalidArgumentException("Cannot broadcast empty list of packets"); } - /** @var NetworkSession[] $recipients */ - $recipients = []; - foreach($players as $player){ - if($player->isConnected()){ - $recipients[] = $player->getNetworkSession(); + return Timings::$broadcastPackets->time(function() use ($players, $packets) : bool{ + /** @var NetworkSession[] $recipients */ + $recipients = []; + foreach($players as $player){ + if($player->isConnected()){ + $recipients[] = $player->getNetworkSession(); + } + } + if(count($recipients) === 0){ + return false; } - } - if(count($recipients) === 0){ - return false; - } - $ev = new DataPacketSendEvent($recipients, $packets); - $ev->call(); - if($ev->isCancelled()){ - return false; - } - $recipients = $ev->getTargets(); + $ev = new DataPacketSendEvent($recipients, $packets); + $ev->call(); + if($ev->isCancelled()){ + return false; + } + $recipients = $ev->getTargets(); - $stream = PacketBatch::fromPackets(...$ev->getPackets()); + $stream = PacketBatch::fromPackets(...$ev->getPackets()); - /** @var Compressor[] $compressors */ - $compressors = []; - /** @var NetworkSession[][] $compressorTargets */ - $compressorTargets = []; - foreach($recipients as $recipient){ - $compressor = $recipient->getCompressor(); - $compressorId = spl_object_id($compressor); - //TODO: different compressors might be compatible, it might not be necessary to split them up by object - $compressors[$compressorId] = $compressor; - $compressorTargets[$compressorId][] = $recipient; - } + /** @var Compressor[] $compressors */ + $compressors = []; + /** @var NetworkSession[][] $compressorTargets */ + $compressorTargets = []; + foreach($recipients as $recipient){ + $compressor = $recipient->getCompressor(); + $compressorId = spl_object_id($compressor); + //TODO: different compressors might be compatible, it might not be necessary to split them up by object + $compressors[$compressorId] = $compressor; + $compressorTargets[$compressorId][] = $recipient; + } - foreach($compressors as $compressorId => $compressor){ - if(!$compressor->willCompress($stream->getBuffer())){ - foreach($compressorTargets[$compressorId] as $target){ - foreach($ev->getPackets() as $pk){ - $target->addToSendBuffer($pk); + foreach($compressors as $compressorId => $compressor){ + if(!$compressor->willCompress($stream->getBuffer())){ + foreach($compressorTargets[$compressorId] as $target){ + foreach($ev->getPackets() as $pk){ + $target->addToSendBuffer($pk); + } + } + }else{ + $promise = $this->prepareBatch($stream, $compressor); + foreach($compressorTargets[$compressorId] as $target){ + $target->queueCompressed($promise); } } - }else{ - $promise = $this->prepareBatch($stream, $compressor); - foreach($compressorTargets[$compressorId] as $target){ - $target->queueCompressed($promise); - } } - } - return true; + return true; + }); } /** diff --git a/src/timings/Timings.php b/src/timings/Timings.php index ff1ede111..d267798dc 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -118,6 +118,9 @@ abstract class Timings{ /** @var TimingsHandler[] */ public static $pluginTaskTimingMap = []; + /** @var TimingsHandler */ + public static $broadcastPackets; + public static function init() : void{ if(self::$initialized){ return; @@ -138,6 +141,8 @@ abstract class Timings{ self::$playerNetworkReceiveDecompressTimer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decompression", self::$playerNetworkReceiveTimer); self::$playerNetworkReceiveDecryptTimer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Player Network Receive - Decryption", self::$playerNetworkReceiveTimer); + self::$broadcastPackets = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Broadcast Packets", self::$playerNetworkSendTimer); + self::$playerChunkOrderTimer = new TimingsHandler("Player Order Chunks"); self::$playerChunkSendTimer = new TimingsHandler("Player Send Chunks"); self::$connectionTimer = new TimingsHandler("Connection Handler");