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 /src/server/game/Entities/Object | |
| parent | 22d29ce0494c32a73e20646d2320a44a5eb2e633 (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.cpp | 33 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 19 |
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: |
