Skip to content

Commit

Permalink
feat(Core/Compression): Move packets compression from map to network …
Browse files Browse the repository at this point in the history
…thread (azerothcore#18602)

* feat(Code/Compression): Move packets compression from map to network thread.

* Code style fix

* Remove unicode letter
  • Loading branch information
walkline authored Mar 28, 2024
1 parent 3ff8de2 commit 73340b9
Show file tree
Hide file tree
Showing 14 changed files with 122 additions and 118 deletions.
6 changes: 3 additions & 3 deletions src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ void BattlegroundSA::StartShips()
UpdateData data;
WorldPacket pkt;
GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, itr->second);
data.BuildPacket(&pkt);
data.BuildPacket(pkt);
itr->second->GetSession()->SendPacket(&pkt);
}
}
Expand Down Expand Up @@ -1106,7 +1106,7 @@ void BattlegroundSA::SendTransportInit(Player* player)
if (BgObjects[BG_SA_BOAT_TWO])
GetBGObject(BG_SA_BOAT_TWO)->BuildCreateUpdateBlockForPlayer(&transData, player);
WorldPacket packet;
transData.BuildPacket(&packet);
transData.BuildPacket(packet);
player->GetSession()->SendPacket(&packet);
}
}
Expand All @@ -1121,7 +1121,7 @@ void BattlegroundSA::SendTransportsRemove(Player* player)
if (BgObjects[BG_SA_BOAT_TWO])
GetBGObject(BG_SA_BOAT_TWO)->BuildOutOfRangeUpdateBlock(&transData);
WorldPacket packet;
transData.BuildPacket(&packet);
transData.BuildPacket(packet);
player->GetSession()->SendPacket(&packet);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/server/game/Entities/GameObject/GameObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ void GameObject::Update(uint32 diff)
UpdateData udata;
WorldPacket packet;
BuildValuesUpdateBlockForPlayer(&udata, caster->ToPlayer());
udata.BuildPacket(&packet);
udata.BuildPacket(packet);
caster->ToPlayer()->GetSession()->SendPacket(&packet);

SendCustomAnim(GetGoAnimProgress());
Expand Down
2 changes: 1 addition & 1 deletion src/server/game/Entities/Object/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ void Object::SendUpdateToPlayer(Player* player)
WorldPacket packet;

BuildCreateUpdateBlockForPlayer(&upd, player);
upd.BuildPacket(&packet);
upd.BuildPacket(packet);
player->GetSession()->SendPacket(&packet);
}

Expand Down
97 changes: 9 additions & 88 deletions src/server/game/Entities/Object/Updates/UpdateData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include "Opcodes.h"
#include "World.h"
#include "WorldPacket.h"
#include "zlib.h"

UpdateData::UpdateData() : m_blockCount(0)
{
Expand All @@ -46,103 +45,25 @@ void UpdateData::AddUpdateBlock(const UpdateData& block)
m_blockCount += block.m_blockCount;
}

void UpdateData::Compress(void* dst, uint32* dst_size, void* src, int src_size)
bool UpdateData::BuildPacket(WorldPacket& packet)
{
z_stream c_stream;
ASSERT(packet.empty());

c_stream.zalloc = (alloc_func)0;
c_stream.zfree = (free_func)0;
c_stream.opaque = (voidpf)0;
packet.reserve(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos());

// default Z_BEST_SPEED (1)
int z_res = deflateInit(&c_stream, sWorld->getIntConfig(CONFIG_COMPRESSION));
if (z_res != Z_OK)
{
LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflateInit) Error code: {} ({})", z_res, zError(z_res));
*dst_size = 0;
return;
}

c_stream.next_out = (Bytef*)dst;
c_stream.avail_out = *dst_size;
c_stream.next_in = (Bytef*)src;
c_stream.avail_in = (uInt)src_size;

z_res = deflate(&c_stream, Z_NO_FLUSH);
if (z_res != Z_OK)
{
LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate) Error code: {} ({})", z_res, zError(z_res));
*dst_size = 0;
return;
}

if (c_stream.avail_in != 0)
{
LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate not greedy)");
*dst_size = 0;
return;
}

z_res = deflate(&c_stream, Z_FINISH);
if (z_res != Z_STREAM_END)
{
LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflate should report Z_STREAM_END instead {} ({})", z_res, zError(z_res));
*dst_size = 0;
return;
}

z_res = deflateEnd(&c_stream);
if (z_res != Z_OK)
{
LOG_ERROR("entities.object", "Can't compress update packet (zlib: deflateEnd) Error code: {} ({})", z_res, zError(z_res));
*dst_size = 0;
return;
}

*dst_size = c_stream.total_out;
}

bool UpdateData::BuildPacket(WorldPacket* packet)
{
ASSERT(packet->empty()); // shouldn't happen

ByteBuffer buf(4 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos());

buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount);
packet << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount);

if (!m_outOfRangeGUIDs.empty())
{
buf << (uint8) UPDATETYPE_OUT_OF_RANGE_OBJECTS;
buf << (uint32) m_outOfRangeGUIDs.size();
packet << (uint8) UPDATETYPE_OUT_OF_RANGE_OBJECTS;
packet << (uint32) m_outOfRangeGUIDs.size();

for (ObjectGuid const& guid : m_outOfRangeGUIDs)
{
buf << guid.WriteAsPacked();
}
packet << guid.WriteAsPacked();
}

buf.append(m_data);

size_t pSize = buf.wpos(); // use real used data size

if (pSize > 100) // compress large packets
{
uint32 destsize = compressBound(pSize);
packet->resize(destsize + sizeof(uint32));

packet->put<uint32>(0, pSize);
Compress(const_cast<uint8*>(packet->contents()) + sizeof(uint32), &destsize, (void*)buf.contents(), pSize);
if (destsize == 0)
return false;

packet->resize(destsize + sizeof(uint32));
packet->SetOpcode(SMSG_COMPRESSED_UPDATE_OBJECT);
}
else // send small packets without compression
{
packet->append(buf);
packet->SetOpcode(SMSG_UPDATE_OBJECT);
}
packet.append(m_data);
packet.SetOpcode(SMSG_UPDATE_OBJECT);

return true;
}
Expand Down
4 changes: 1 addition & 3 deletions src/server/game/Entities/Object/Updates/UpdateData.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,13 @@ class UpdateData
void AddOutOfRangeGUID(ObjectGuid guid);
void AddUpdateBlock(const ByteBuffer& block);
void AddUpdateBlock(const UpdateData& block);
bool BuildPacket(WorldPacket* packet);
bool BuildPacket(WorldPacket& packet);
[[nodiscard]] bool HasData() const { return m_blockCount > 0 || !m_outOfRangeGUIDs.empty(); }
void Clear();

protected:
uint32 m_blockCount;
GuidVector m_outOfRangeGUIDs;
ByteBuffer m_data;

void Compress(void* dst, uint32* dst_size, void* src, int src_size);
};
#endif
4 changes: 2 additions & 2 deletions src/server/game/Entities/Player/PlayerUpdates.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1739,7 +1739,7 @@ void Player::UpdateTriggerVisibility()
if (!udata.HasData())
return;

udata.BuildPacket(&packet);
udata.BuildPacket(packet);
GetSession()->SendPacket(&packet);
}

Expand Down Expand Up @@ -1791,7 +1791,7 @@ void Player::UpdateForQuestWorldObjects()
}
}

udata.BuildPacket(&packet);
udata.BuildPacket(packet);
GetSession()->SendPacket(&packet);
}

Expand Down
2 changes: 1 addition & 1 deletion src/server/game/Entities/Unit/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10595,7 +10595,7 @@ void Unit::SetOwnerGUID(ObjectGuid owner)
UpdateData udata;
WorldPacket packet;
BuildValuesUpdateBlockForPlayer(&udata, player);
udata.BuildPacket(&packet);
udata.BuildPacket(packet);
player->SendDirectMessage(&packet);

RemoveFieldNotifyFlag(UF_FLAG_OWNER);
Expand Down
2 changes: 1 addition & 1 deletion src/server/game/Grids/Notifiers/GridNotifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ void VisibleNotifier::SendToSelf()
return;

WorldPacket packet;
i_data.BuildPacket(&packet);
i_data.BuildPacket(packet);
i_player.GetSession()->SendPacket(&packet);

for (std::vector<Unit*>::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it)
Expand Down
4 changes: 2 additions & 2 deletions src/server/game/Groups/Group.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,7 @@ bool Group::AddMember(Player* player)
player->BuildValuesUpdateBlockForPlayer(&newData, itrMember);
if (newData.HasData())
{
newData.BuildPacket(&newDataPacket);
newData.BuildPacket(newDataPacket);
itrMember->SendDirectMessage(&newDataPacket);
}
}
Expand All @@ -529,7 +529,7 @@ bool Group::AddMember(Player* player)

if (groupData.HasData())
{
groupData.BuildPacket(&groupDataPacket);
groupData.BuildPacket(groupDataPacket);
player->SendDirectMessage(&groupDataPacket);
}

Expand Down
14 changes: 7 additions & 7 deletions src/server/game/Maps/Map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ bool Map::AddToMap(MotionTransport* obj, bool /*checkTransport*/)
UpdateData data;
obj->BuildCreateUpdateBlockForPlayer(&data, itr->GetSource());
WorldPacket packet;
data.BuildPacket(&packet);
data.BuildPacket(packet);
itr->GetSource()->SendDirectMessage(&packet);
}
}
Expand Down Expand Up @@ -971,7 +971,7 @@ void Map::RemoveFromMap(MotionTransport* obj, bool remove)
UpdateData data;
obj->BuildOutOfRangeUpdateBlock(&data);
WorldPacket packet;
data.BuildPacket(&packet);
data.BuildPacket(packet);
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (itr->GetSource()->GetTransport() != obj)
itr->GetSource()->SendDirectMessage(&packet);
Expand Down Expand Up @@ -2536,7 +2536,7 @@ void Map::SendInitSelf(Player* player)
player->BuildCreateUpdateBlockForPlayer(&data, player);

// build and send self update packet before sending to player his own auras
data.BuildPacket(&packet);
data.BuildPacket(packet);
player->SendDirectMessage(&packet);

// send to player his own auras (this is needed here for timely initialization of some fields on client)
Expand All @@ -2552,7 +2552,7 @@ void Map::SendInitSelf(Player* player)
if (player != (*itr) && player->HaveAtClient(*itr))
(*itr)->BuildCreateUpdateBlockForPlayer(&data, player);

data.BuildPacket(&packet);
data.BuildPacket(packet);
player->SendDirectMessage(&packet);
}

Expand All @@ -2565,7 +2565,7 @@ void Map::SendInitTransports(Player* player)
(*itr)->BuildCreateUpdateBlockForPlayer(&transData, player);

WorldPacket packet;
transData.BuildPacket(&packet);
transData.BuildPacket(packet);
player->GetSession()->SendPacket(&packet);
}

Expand All @@ -2590,7 +2590,7 @@ void Map::SendRemoveTransports(Player* player)
}

WorldPacket packet;
transData.BuildPacket(&packet);
transData.BuildPacket(packet);
player->GetSession()->SendPacket(&packet);
}

Expand Down Expand Up @@ -2621,7 +2621,7 @@ void Map::SendObjectUpdates()
WorldPacket packet; // here we allocate a std::vector with a size of 0x10000
for (UpdateDataMapType::iterator iter = update_players.begin(); iter != update_players.end(); ++iter)
{
iter->second.BuildPacket(&packet);
iter->second.BuildPacket(packet);
iter->first->GetSession()->SendPacket(&packet);
packet.clear(); // clean the string
}
Expand Down
Loading

0 comments on commit 73340b9

Please sign in to comment.