Core/Networking: Optimize CPU consumption by decreasing heap allocations when packet queue is empty. (#30007)

(cherry picked from commit ad3aeaa1471555328c54680029169e0b0c8c77b1)
Signed-off-by: luis <[email protected]>
This commit is contained in:
Anton Popovichenko
2026-06-01 19:16:30 -03:00
committed by luis
parent d012ffb88a
commit 5d01fbe178
+28 -24
View File
@@ -202,35 +202,39 @@ bool WorldSocket::InitializeCompression()
bool WorldSocket::Update()
{
EncryptablePacket* queued;
MessageBuffer buffer(_sendBufferSize);
while (_bufferQueue.Dequeue(queued))
if (_bufferQueue.Dequeue(queued))
{
uint32 packetSize = queued->size() + 4 /*opcode*/;
if (packetSize > MinSizeForCompression && queued->NeedsEncryption())
packetSize = deflateBound(_compressionStream, packetSize) + sizeof(CompressedWorldPacket);
// Flush current buffer if too small for next packet
if (buffer.GetRemainingSpace() < packetSize + sizeof(PacketHeader))
// Allocate buffer only when it's needed but not on every Update() call.
MessageBuffer buffer(_sendBufferSize);
do
{
uint32 packetSize = queued->size() + 4 /*opcode*/;
if (packetSize > MinSizeForCompression && queued->NeedsEncryption())
packetSize = deflateBound(_compressionStream, packetSize) + sizeof(CompressedWorldPacket);
// Flush current buffer if too small for next packet
if (buffer.GetRemainingSpace() < packetSize + sizeof(PacketHeader))
{
QueuePacket(std::move(buffer));
buffer.Resize(_sendBufferSize);
}
if (buffer.GetRemainingSpace() >= packetSize + sizeof(PacketHeader))
WritePacketToBuffer(*queued, buffer);
else // single packet larger than _sendBufferSize
{
MessageBuffer packetBuffer(packetSize + sizeof(PacketHeader));
WritePacketToBuffer(*queued, packetBuffer);
QueuePacket(std::move(packetBuffer));
}
delete queued;
} while (_bufferQueue.Dequeue(queued));
if (buffer.GetActiveSize() > 0)
QueuePacket(std::move(buffer));
buffer.Resize(_sendBufferSize);
}
if (buffer.GetRemainingSpace() >= packetSize + sizeof(PacketHeader))
WritePacketToBuffer(*queued, buffer);
else // single packet larger than _sendBufferSize
{
MessageBuffer packetBuffer(packetSize + sizeof(PacketHeader));
WritePacketToBuffer(*queued, packetBuffer);
QueuePacket(std::move(packetBuffer));
}
delete queued;
}
if (buffer.GetActiveSize() > 0)
QueuePacket(std::move(buffer));
if (!BaseSocket::Update())
return false;