diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-07-11 17:14:42 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-07-11 17:14:42 +0200 |
commit | 9b14e8248c683ba93314d44ea86a162c81c9854a (patch) | |
tree | 3e897744c14e8b62211d29370453a19d0d448a83 | |
parent | 22d29ce0494c32a73e20646d2320a44a5eb2e633 (diff) |
Core/PacketIO: SMSG_UPDATE_OBJECT optimization - removed unneccessary memory allocation by dynamic_bitset
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 19 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 11 |
6 files changed, 50 insertions, 50 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index fd538c31809..b26839aade6 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -34,7 +34,6 @@ #include "UpdateFieldFlags.h" #include "World.h" #include "Transport.h" -#include <boost/dynamic_bitset.hpp> GameObject::GameObject() : WorldObject(false), MapObject(), m_model(NULL), m_goValue(), m_AI(NULL), _animKitId(0) @@ -2300,16 +2299,16 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t bool forcedFlags = GetGoType() == GAMEOBJECT_TYPE_CHEST && GetGOInfo()->chest.usegrouplootrules && HasLootRecipient(); bool targetIsGM = target->IsGameMaster(); - boost::dynamic_bitset<uint32> updateMask(m_valuesCount); + std::size_t blockCount = UpdateMask::GetBlockCount(m_valuesCount); uint32* flags = GameObjectUpdateFieldFlags; uint32 visibleFlag = UF_FLAG_PUBLIC; if (GetOwnerGUID() == target->GetGUID()) visibleFlag |= UF_FLAG_OWNER; - *data << uint8(updateMask.num_blocks()); + *data << uint8(blockCount); std::size_t maskPos = data->wpos(); - data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32)); + data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType)); for (uint16 index = 0; index < m_valuesCount; ++index) { @@ -2317,7 +2316,7 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t ((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)) || (index == GAMEOBJECT_FLAGS && forcedFlags)) { - updateMask.set(index); + UpdateMask::SetUpdateBit(data->contents() + maskPos, index); if (index == OBJECT_DYNAMIC_FLAGS) { @@ -2391,8 +2390,6 @@ void GameObject::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* t *data << m_uint32Values[index]; // other cases } } - - boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos)); } void GameObject::GetRespawnPosition(float &x, float &y, float &z, float* ori /* = NULL*/) const diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 565609fc561..3efb66d7d1c 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -31,7 +31,6 @@ #include "WorldSession.h" #include "ItemPackets.h" #include "TradeData.h" -#include <boost/dynamic_bitset.hpp> void AddItemsSetItem(Player* player, Item* item) { @@ -1128,14 +1127,14 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* if (!target) return; - boost::dynamic_bitset<uint32> updateMask(_dynamicValuesCount); + std::size_t blockCount = UpdateMask::GetBlockCount(_dynamicValuesCount); uint32* flags = nullptr; uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags); - *data << uint8(updateMask.num_blocks()); + *data << uint8(blockCount); std::size_t maskPos = data->wpos(); - data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32)); + data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType)); for (uint16 index = 0; index < _dynamicValuesCount; ++index) { @@ -1143,19 +1142,19 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* if (_fieldNotifyFlags & flags[index] || ((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask[index] : !values.empty()) && (flags[index] & visibleFlag))) { - updateMask.set(index); + UpdateMask::SetUpdateBit(data->contents() + maskPos, index); - boost::dynamic_bitset<uint32> arrayMask(values.size()); - *data << uint8(arrayMask.num_blocks()); - std::size_t fieldMaskPos = data->wpos(); - data->resize(data->size() + arrayMask.num_blocks() * sizeof(uint32)); + std::size_t arrayBlockCount = UpdateMask::GetBlockCount(values.size()); + *data << uint8(arrayBlockCount); + std::size_t arrayMaskPos = data->wpos(); + data->resize(data->size() + arrayBlockCount * sizeof(UpdateMask::BlockType)); if (index != ITEM_DYNAMIC_FIELD_MODIFIERS) { for (std::size_t v = 0; v < values.size(); ++v) { if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index][v] : values[v]) { - arrayMask.set(v); + UpdateMask::SetUpdateBit(data->contents() + arrayMaskPos, v); *data << uint32(values[v]); } } @@ -1169,18 +1168,14 @@ void Item::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* { if (values[v] || _dynamicChangesArrayMask[index][v]) { - arrayMask.set(m++); + UpdateMask::SetUpdateBit(data->contents() + arrayMaskPos, m++); *data << uint32(values[v]); } } } - - boost::to_block_range(arrayMask, reinterpret_cast<uint32*>(data->contents() + fieldMaskPos)); } } - - boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos)); } void Item::AddToObjectUpdate() diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 99a9cfd25d8..cce819c1dc2 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -45,7 +45,6 @@ #include "BattlefieldMgr.h" #include "GameObjectPackets.h" #include "MiscPackets.h" -#include <boost/dynamic_bitset.hpp> Object::Object() { @@ -750,27 +749,25 @@ void Object::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* targe if (!target) return; - boost::dynamic_bitset<uint32> updateMask(m_valuesCount); + std::size_t blockCount = UpdateMask::GetBlockCount(m_valuesCount); uint32* flags = NULL; uint32 visibleFlag = GetUpdateFieldData(target, flags); ASSERT(flags); - *data << uint8(updateMask.num_blocks()); + *data << uint8(blockCount); std::size_t maskPos = data->wpos(); - data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32)); + data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType)); for (uint16 index = 0; index < m_valuesCount; ++index) { if (_fieldNotifyFlags & flags[index] || ((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag))) { - updateMask.set(index); + UpdateMask::SetUpdateBit(data->contents() + maskPos, index); *data << m_uint32Values[index]; } } - - boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos)); } void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) const @@ -778,14 +775,14 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player if (!target) return; - boost::dynamic_bitset<uint32> updateMask(_dynamicValuesCount); + std::size_t blockCount = UpdateMask::GetBlockCount(_dynamicValuesCount); uint32* flags = nullptr; uint32 visibleFlag = GetDynamicUpdateFieldData(target, flags); - *data << uint8(updateMask.num_blocks()); + *data << uint8(blockCount); std::size_t maskPos = data->wpos(); - data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32)); + data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType)); for (uint16 index = 0; index < _dynamicValuesCount; ++index) { @@ -793,26 +790,22 @@ void Object::BuildDynamicValuesUpdate(uint8 updateType, ByteBuffer* data, Player if (_fieldNotifyFlags & flags[index] || ((updateType == UPDATETYPE_VALUES ? _dynamicChangesMask[index] : !values.empty()) && (flags[index] & visibleFlag))) { - updateMask.set(index); + UpdateMask::SetUpdateBit(data->contents() + maskPos, index); - boost::dynamic_bitset<uint32> arrayMask(values.size()); - *data << uint8(arrayMask.num_blocks()); - std::size_t fieldMaskPos = data->wpos(); - data->resize(data->size() + arrayMask.num_blocks() * sizeof(uint32)); + std::size_t arrayBlockCount = UpdateMask::GetBlockCount(values.size()); + *data << uint8(arrayBlockCount); + std::size_t arrayMaskPos = data->wpos(); + data->resize(data->size() + arrayBlockCount * sizeof(UpdateMask::BlockType)); for (std::size_t v = 0; v < values.size(); ++v) { if (updateType == UPDATETYPE_VALUES ? _dynamicChangesArrayMask[index][v] : values[v]) { - arrayMask.set(v); + UpdateMask::SetUpdateBit(data->contents() + arrayMaskPos, v); *data << uint32(values[v]); } } - - boost::to_block_range(arrayMask, reinterpret_cast<uint32*>(data->contents() + fieldMaskPos)); } } - - boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos)); } void Object::AddToObjectUpdateIfNeeded() diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index ea3b5fc6f0a..25bddef1535 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -92,6 +92,25 @@ class ZoneScript; typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType; +namespace UpdateMask +{ + typedef uint32 BlockType; + + inline std::size_t GetBlockCount(std::size_t bitCount) + { + using BitsPerBlock = std::integral_constant<std::size_t, sizeof(BlockType) * 8>; + return (bitCount + BitsPerBlock::value - 1) / BitsPerBlock::value; + } + + template<typename T> + inline void SetUpdateBit(T* data, std::size_t bitIndex) + { + static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, "Type used for SetUpdateBit data arg is not an unsigned integer"); + using BitsPerBlock = std::integral_constant<std::size_t, sizeof(T) * 8>; + data[bitIndex / BitsPerBlock::value] |= T(1) << (bitIndex % BitsPerBlock::value); + } +} + class TC_GAME_API Object { public: diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 33666bdd5b3..d891ec94105 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -53,7 +53,6 @@ class Pet; class PlayerMenu; class PlayerSocial; class SpellCastTargets; -class UpdateMask; class PlayerAI; typedef std::deque<Mail*> PlayerMails; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 002cc54ebd9..fac87a7723c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -70,7 +70,6 @@ #include "VehiclePackets.h" #include "LootPackets.h" #include "PartyPackets.h" -#include <boost/dynamic_bitset.hpp> #include <cmath> float baseMoveSpeed[MAX_MOVE_TYPE] = @@ -15752,7 +15751,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) else if (GetTypeId() == TYPEID_PLAYER) valCount = PLAYER_FIELD_END_NOT_SELF; - boost::dynamic_bitset<uint32> updateMask(valCount); + std::size_t blockCount = UpdateMask::GetBlockCount(valCount); Player* plr = GetCharmerOrOwnerPlayerOrPlayerItself(); if (GetOwnerGUID() == target->GetGUID()) @@ -15767,9 +15766,9 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) Creature const* creature = ToCreature(); - *data << uint8(updateMask.num_blocks()); + *data << uint8(blockCount); std::size_t maskPos = data->wpos(); - data->resize(data->size() + updateMask.num_blocks() * sizeof(uint32)); + data->resize(data->size() + blockCount * sizeof(UpdateMask::BlockType)); for (uint16 index = 0; index < valCount; ++index) { @@ -15778,7 +15777,7 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) ((updateType == UPDATETYPE_VALUES ? _changesMask[index] : m_uint32Values[index]) && (flags[index] & visibleFlag)) || (index == UNIT_FIELD_AURASTATE && HasFlag(UNIT_FIELD_AURASTATE, PER_CASTER_AURA_STATE_MASK))) { - updateMask.set(index); + UpdateMask::SetUpdateBit(data->contents() + maskPos, index); if (index == UNIT_NPC_FLAGS) { @@ -15897,8 +15896,6 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) } } } - - boost::to_block_range(updateMask, reinterpret_cast<uint32*>(data->contents() + maskPos)); } void Unit::DestroyForPlayer(Player* target) const |