diff --git a/src/Server.php b/src/Server.php index f75371cc1..5eedb66e4 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1236,18 +1236,21 @@ class Server{ /** * Broadcasts a list of packets in a batch to a list of players + * + * @param bool|null $sync Compression on the main thread (true) or workers (false). Default is automatic (null). */ - public function prepareBatch(PacketBatch $stream, Compressor $compressor, bool $forceSync = false) : CompressBatchPromise{ + public function prepareBatch(PacketBatch $stream, Compressor $compressor, ?bool $sync = null) : CompressBatchPromise{ try{ Timings::$playerNetworkSendCompressTimer->startTiming(); $buffer = $stream->getBuffer(); - if(!$compressor->willCompress($buffer)){ - $forceSync = true; + + if($sync === null){ + $sync = !($this->networkCompressionAsync && $compressor->willCompress($buffer)); } $promise = new CompressBatchPromise(); - if(!$forceSync and $this->networkCompressionAsync){ + if(!$sync){ $task = new CompressBatchTask($buffer, $promise, $compressor); $this->asyncPool->submitTask($task); }else{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index ef8faefc4..2bd9799e7 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -164,6 +164,8 @@ class NetworkSession{ private $compressedQueue; /** @var Compressor */ private $compressor; + /** @var bool */ + private $forceAsyncCompression = true; /** @var PacketPool */ private $packetPool; @@ -424,7 +426,13 @@ class NetworkSession{ private function flushSendBuffer(bool $immediate = false) : void{ if(count($this->sendBuffer) > 0){ - $promise = $this->server->prepareBatch(PacketBatch::fromPackets(...$this->sendBuffer), $this->compressor, $immediate); + $syncMode = null; //automatic + if($immediate){ + $syncMode = true; + }elseif($this->forceAsyncCompression){ + $syncMode = false; + } + $promise = $this->server->prepareBatch(PacketBatch::fromPackets(...$this->sendBuffer), $this->compressor, $syncMode); $this->sendBuffer = []; $this->queueCompressedNoBufferFlush($promise, $immediate); } @@ -641,6 +649,7 @@ class NetworkSession{ $this->logger->debug("Received spawn response, entering in-game phase"); $this->player->setImmobile(false); //TODO: HACK: we set this during the spawn sequence to prevent the client sending junk movements $this->player->doFirstSpawn(); + $this->forceAsyncCompression = false; $this->setHandler(new InGamePacketHandler($this->player, $this)); }