aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-07-11 17:14:42 +0200
committerShauren <shauren.trinity@gmail.com>2016-07-11 17:14:42 +0200
commit9b14e8248c683ba93314d44ea86a162c81c9854a (patch)
tree3e897744c14e8b62211d29370453a19d0d448a83
parent22d29ce0494c32a73e20646d2320a44a5eb2e633 (diff)
Core/PacketIO: SMSG_UPDATE_OBJECT optimization - removed unneccessary memory allocation by dynamic_bitset
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp11
-rw-r--r--src/server/game/Entities/Item/Item.cpp25
-rw-r--r--src/server/game/Entities/Object/Object.cpp33
-rw-r--r--src/server/game/Entities/Object/Object.h19
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp11
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