From f72d7284b9421e4696ebf60eef392867c79e5368 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Thu, 30 Oct 2014 23:13:25 +0100 Subject: [PATCH] Added EncapsulatedPacket reuse on broadcast --- src/pocketmine/Server.php | 3 ++ .../network/CachedEncapsulatedPacket.php | 33 +++++++++++++++++++ src/pocketmine/network/RakLibInterface.php | 28 ++++++++++++---- 3 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 src/pocketmine/network/CachedEncapsulatedPacket.php diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 21f829b0f..5a3d46b56 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1720,6 +1720,9 @@ class Server{ foreach($players as $player){ $player->dataPacket($packet); } + if(isset($packet->__encapsulatedPacket)){ + unset($packet->__encapsulatedPacket); + } } diff --git a/src/pocketmine/network/CachedEncapsulatedPacket.php b/src/pocketmine/network/CachedEncapsulatedPacket.php new file mode 100644 index 000000000..0ddcff4b7 --- /dev/null +++ b/src/pocketmine/network/CachedEncapsulatedPacket.php @@ -0,0 +1,33 @@ +internalData === null ? ($this->internalData = parent::toBinary($internal)) : $this->internalData; + } +} \ No newline at end of file diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index 8950733ef..3619ed05c 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -222,17 +222,31 @@ class RakLibInterface implements ServerInstance, SourceInterface{ public function putPacket(Player $player, DataPacket $packet, $needACK = false, $immediate = false){ if(isset($this->identifiers[$player])){ $identifier = $this->identifiers[$player]; + $pk = null; if(!$packet->isEncoded){ $packet->encode(); + unset($packet->__encapsulatedPacket); + }elseif(!$needACK){ + if(!isset($packet->__encapsulatedPacket)){ + $packet->__encapsulatedPacket = new CachedEncapsulatedPacket; + $packet->__encapsulatedPacket->identifierACK = null; + $packet->__encapsulatedPacket->buffer = $packet->buffer; + $packet->__encapsulatedPacket->reliability = 2; + } + $pk = $packet->__encapsulatedPacket; } - $pk = EncapsulatedPacket::getPacketFromPool(); - $pk->buffer = $packet->buffer; - $pk->reliability = 2; - if($needACK === true){ - $pk->identifierACK = $this->identifiersACK[$identifier]++; - }else{ - $pk->identifierACK = null; + + if($pk === null){ + $pk = EncapsulatedPacket::getPacketFromPool(); + $pk->buffer = $packet->buffer; + $pk->reliability = 2; + if($needACK === true){ + $pk->identifierACK = $this->identifiersACK[$identifier]++; + }else{ + $pk->identifierACK = null; + } } + $this->interface->sendEncapsulated($identifier, $pk, ($needACK === true ? RakLib::FLAG_NEED_ACK : 0) | ($immediate === true ? RakLib::PRIORITY_IMMEDIATE : RakLib::PRIORITY_NORMAL)); return $pk->identifierACK;