mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-07-07 10:31:51 +00:00
NetworkSession: Force use of async compression during the login sequence when latency doesn't matter
closes #3907 this reduces the impact of compression on the login sequence by about 90%; however, since compression only accounted for about 30% of said overhead at most, it's not really a massive difference.
This commit is contained in:
parent
4ea5401d72
commit
0be60fe1eb
@ -1236,18 +1236,21 @@ class Server{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Broadcasts a list of packets in a batch to a list of players
|
* 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{
|
try{
|
||||||
Timings::$playerNetworkSendCompressTimer->startTiming();
|
Timings::$playerNetworkSendCompressTimer->startTiming();
|
||||||
|
|
||||||
$buffer = $stream->getBuffer();
|
$buffer = $stream->getBuffer();
|
||||||
if(!$compressor->willCompress($buffer)){
|
|
||||||
$forceSync = true;
|
if($sync === null){
|
||||||
|
$sync = !($this->networkCompressionAsync && $compressor->willCompress($buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
$promise = new CompressBatchPromise();
|
$promise = new CompressBatchPromise();
|
||||||
if(!$forceSync and $this->networkCompressionAsync){
|
if(!$sync){
|
||||||
$task = new CompressBatchTask($buffer, $promise, $compressor);
|
$task = new CompressBatchTask($buffer, $promise, $compressor);
|
||||||
$this->asyncPool->submitTask($task);
|
$this->asyncPool->submitTask($task);
|
||||||
}else{
|
}else{
|
||||||
|
@ -164,6 +164,8 @@ class NetworkSession{
|
|||||||
private $compressedQueue;
|
private $compressedQueue;
|
||||||
/** @var Compressor */
|
/** @var Compressor */
|
||||||
private $compressor;
|
private $compressor;
|
||||||
|
/** @var bool */
|
||||||
|
private $forceAsyncCompression = true;
|
||||||
|
|
||||||
/** @var PacketPool */
|
/** @var PacketPool */
|
||||||
private $packetPool;
|
private $packetPool;
|
||||||
@ -424,7 +426,13 @@ class NetworkSession{
|
|||||||
|
|
||||||
private function flushSendBuffer(bool $immediate = false) : void{
|
private function flushSendBuffer(bool $immediate = false) : void{
|
||||||
if(count($this->sendBuffer) > 0){
|
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->sendBuffer = [];
|
||||||
$this->queueCompressedNoBufferFlush($promise, $immediate);
|
$this->queueCompressedNoBufferFlush($promise, $immediate);
|
||||||
}
|
}
|
||||||
@ -641,6 +649,7 @@ class NetworkSession{
|
|||||||
$this->logger->debug("Received spawn response, entering in-game phase");
|
$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->setImmobile(false); //TODO: HACK: we set this during the spawn sequence to prevent the client sending junk movements
|
||||||
$this->player->doFirstSpawn();
|
$this->player->doFirstSpawn();
|
||||||
|
$this->forceAsyncCompression = false;
|
||||||
$this->setHandler(new InGamePacketHandler($this->player, $this));
|
$this->setHandler(new InGamePacketHandler($this->player, $this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user