aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
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 /src/server/game/Entities/Object
parent22d29ce0494c32a73e20646d2320a44a5eb2e633 (diff)
Core/PacketIO: SMSG_UPDATE_OBJECT optimization - removed unneccessary memory allocation by dynamic_bitset
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp33
-rw-r--r--src/server/game/Entities/Object/Object.h19
2 files changed, 32 insertions, 20 deletions
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: