From 91e38d1f9729b67f030450795bec79d20ebd3b9f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 7 Jan 2023 21:33:34 +0000 Subject: [PATCH] NetworkSession: compensate for server lag in batch budgeting --- src/network/mcpe/NetworkSession.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 47e63c37c..cbeab346a 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -193,6 +193,8 @@ class NetworkSession{ */ private ObjectSet $disposeHooks; + private int $lastUpdateTimeNs; + public function __construct( private Server $server, private NetworkSessionManager $manager, @@ -213,6 +215,7 @@ class NetworkSession{ $this->disposeHooks = new ObjectSet(); $this->connectTime = time(); + $this->lastUpdateTimeNs = hrtime(true); $this->setHandler(new SessionStartPacketHandler( $this->server, @@ -1127,6 +1130,10 @@ class NetworkSession{ } public function tick() : void{ + $nowNs = hrtime(true); + $timeSinceLastUpdateNs = $nowNs - $this->lastUpdateTimeNs; + $this->lastUpdateTimeNs = $nowNs; + if($this->info === null){ if(time() >= $this->connectTime + 10){ $this->disconnect("Login timeout"); @@ -1148,6 +1155,15 @@ class NetworkSession{ } $this->flushSendBuffer(); - $this->incomingPacketBatchBudget = min($this->incomingPacketBatchBudget + self::INCOMING_PACKET_BATCH_PER_TICK, self::INCOMING_PACKET_BATCH_MAX_BUDGET); + $ticksSinceLastUpdate = intdiv($timeSinceLastUpdateNs, 50_000_000); + if($ticksSinceLastUpdate > 0){ + if($ticksSinceLastUpdate > 1){ + $this->logger->debug("Adding packet budget for $ticksSinceLastUpdate ticks (current budget is $this->incomingPacketBatchBudget)"); + } + $this->incomingPacketBatchBudget = min( + $this->incomingPacketBatchBudget + (self::INCOMING_PACKET_BATCH_PER_TICK * $ticksSinceLastUpdate), + self::INCOMING_PACKET_BATCH_MAX_BUDGET + ); + } } }