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:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user