mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-17 10:55:43 +00:00
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.
This commit is contained in:
committed by
GitHub
parent
2aaf8474ba
commit
aee2eefb92
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user