From aee2eefb92fbd9a6ac64dc446193703d16d26d7c Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Mon, 1 Apr 2024 10:49:42 +0200 Subject: [PATCH] feat(Core/Optimization): Reduce CPU consumption by allocating sendBuffer only when it is needed. (#18628) * feat(Core/Optimization): Reduce CPU consumption by allocating the sendBuffer only when it is needed. * Remove whitespaces. --- src/server/game/Server/WorldSocket.cpp | 67 ++++++++++++++------------ 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 05235bc6f..2b44a26ee 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -161,43 +161,46 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result) bool WorldSocket::Update() { EncryptableAndCompressiblePacket* queued; - MessageBuffer buffer(_sendBufferSize); - while (_bufferQueue.Dequeue(queued)) + if (_bufferQueue.Dequeue(queued)) { - queued->CompressIfNeeded(); - - ServerPktHeader header(queued->size() + 2, queued->GetOpcode()); - if (queued->NeedsEncryption()) - _authCrypt.EncryptSend(header.header, header.getHeaderLength()); - - if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength()) + // Allocate buffer only when it's needed but not on every Update() call. + MessageBuffer buffer(_sendBufferSize); + do { + queued->CompressIfNeeded(); + ServerPktHeader header(queued->size() + 2, queued->GetOpcode()); + if (queued->NeedsEncryption()) + _authCrypt.EncryptSend(header.header, header.getHeaderLength()); + + if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength()) + { + QueuePacket(std::move(buffer)); + buffer.Resize(_sendBufferSize); + } + + if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength()) + { + buffer.Write(header.header, header.getHeaderLength()); + if (!queued->empty()) + buffer.Write(queued->contents(), queued->size()); + } + else // single packet larger than 4096 bytes + { + MessageBuffer packetBuffer(queued->size() + header.getHeaderLength()); + packetBuffer.Write(header.header, header.getHeaderLength()); + if (!queued->empty()) + packetBuffer.Write(queued->contents(), queued->size()); + + QueuePacket(std::move(packetBuffer)); + } + + delete queued; + } while (_bufferQueue.Dequeue(queued)); + + if (buffer.GetActiveSize() > 0) QueuePacket(std::move(buffer)); - buffer.Resize(_sendBufferSize); - } - - if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength()) - { - buffer.Write(header.header, header.getHeaderLength()); - if (!queued->empty()) - buffer.Write(queued->contents(), queued->size()); - } - else // single packet larger than 4096 bytes - { - MessageBuffer packetBuffer(queued->size() + header.getHeaderLength()); - packetBuffer.Write(header.header, header.getHeaderLength()); - if (!queued->empty()) - packetBuffer.Write(queued->contents(), queued->size()); - - QueuePacket(std::move(packetBuffer)); - } - - delete queued; } - if (buffer.GetActiveSize() > 0) - QueuePacket(std::move(buffer)); - if (!BaseSocket::Update()) return false;