mirror of
https://github.com/liyunfan1223/azerothcore-wotlk.git
synced 2026-08-09 08:17:56 +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()
|
bool WorldSocket::Update()
|
||||||
{
|
{
|
||||||
EncryptableAndCompressiblePacket* queued;
|
EncryptableAndCompressiblePacket* queued;
|
||||||
MessageBuffer buffer(_sendBufferSize);
|
if (_bufferQueue.Dequeue(queued))
|
||||||
while (_bufferQueue.Dequeue(queued))
|
|
||||||
{
|
{
|
||||||
queued->CompressIfNeeded();
|
// Allocate buffer only when it's needed but not on every Update() call.
|
||||||
|
MessageBuffer buffer(_sendBufferSize);
|
||||||
ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
|
do
|
||||||
if (queued->NeedsEncryption())
|
|
||||||
_authCrypt.EncryptSend(header.header, header.getHeaderLength());
|
|
||||||
|
|
||||||
if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength())
|
|
||||||
{
|
{
|
||||||
|
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));
|
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())
|
if (!BaseSocket::Update())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user