Core/Misc: Reduce memory usage when data query cache is disabled in config

This commit is contained in:
Shauren
2026-03-13 12:57:02 +01:00
parent fa514742e5
commit b63bf1c1e6
22 changed files with 40 additions and 30 deletions

View File

@@ -30,6 +30,7 @@
#include "PhasingHandler.h"
#include "Player.h"
#include "UpdateData.h"
#include "WorldPacket.h"
#include "WorldSession.h"
Conversation::Conversation() : WorldObject(false), _duration(0), _textureKitId(0)

View File

@@ -28,6 +28,7 @@
#include "Player.h"
#include "StringConvert.h"
#include "UpdateData.h"
#include "WorldPacket.h"
#include <sstream>
Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES), m_type(type)

View File

@@ -167,6 +167,8 @@ CreatureModel const* CreatureTemplate::GetFirstVisibleModel() const
void CreatureTemplate::InitializeQueryData()
{
QueryData = std::make_unique<WorldPacket[]>(TOTAL_LOCALES);
for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
{
if (!sWorld->getBoolConfig(CONFIG_LOAD_LOCALES) && loc != DEFAULT_LOCALE)

View File

@@ -25,11 +25,12 @@
#include "SharedDefines.h"
#include "SpawnData.h"
#include "UnitDefines.h"
#include "WorldPacket.h"
#include <memory>
#include <string>
#include <unordered_map>
#include <cmath>
class WorldPacket;
struct ItemTemplate;
enum class VisibilityDistanceType : uint8;
@@ -533,7 +534,7 @@ struct TC_GAME_API CreatureTemplate
uint32 flags_extra;
uint32 ScriptID;
std::string StringId;
WorldPacket QueryData[TOTAL_LOCALES];
std::unique_ptr<WorldPacket[]> QueryData;
CreatureModel const* GetModelByIdx(uint32 idx) const;
CreatureModel const* GetRandomValidModel() const;
CreatureModel const* GetFirstValidModel() const;

View File

@@ -558,7 +558,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const
{
if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES))
if (quest->QueryData)
_session->SendPacket(&quest->QueryData[static_cast<uint32>(_session->GetSessionDbLocaleIndex())]);
else
{

View File

@@ -30,6 +30,7 @@
#include "Transport.h"
#include "Unit.h"
#include "UpdateData.h"
#include "WorldPacket.h"
DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
_aura(nullptr), _removedAura(nullptr), _caster(nullptr), _duration(0), _isViewpoint(false)

View File

@@ -63,6 +63,8 @@
void GameObjectTemplate::InitializeQueryData()
{
QueryData = std::make_unique<WorldPacket[]>(TOTAL_LOCALES);
for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
{
if (!sWorld->getBoolConfig(CONFIG_LOAD_LOCALES) && loc != DEFAULT_LOCALE)

View File

@@ -22,11 +22,13 @@
#include "QuaternionData.h"
#include "SharedDefines.h"
#include "SpawnData.h"
#include "WorldPacket.h"
#include <array>
#include <memory>
#include <set>
#include <string>
class WorldPacket;
enum class GameObjectChestFlags : int32
{
Consumable = 0x0001,
@@ -883,7 +885,7 @@ struct GameObjectTemplate
std::string AIName;
uint32 ScriptId;
std::string StringId;
WorldPacket QueryData[TOTAL_LOCALES];
std::unique_ptr<WorldPacket[]> QueryData;
// helpers
bool IsDespawnAtAction() const

View File

@@ -20,6 +20,7 @@
#include "DB2Stores.h"
#include "Player.h"
#include "UpdateData.h"
#include "WorldPacket.h"
AzeriteEmpoweredItem::AzeriteEmpoweredItem()
{

View File

@@ -24,6 +24,7 @@
#include "GameTime.h"
#include "Player.h"
#include "UpdateData.h"
#include "WorldPacket.h"
#include <boost/date_time/gregorian/gregorian_types.hpp>
#include <boost/date_time/posix_time/conversion.hpp>

View File

@@ -15,14 +15,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Common.h"
#include "ObjectMgr.h"
#include "DatabaseEnv.h"
#include "Bag.h"
#include "Common.h"
#include "DatabaseEnv.h"
#include "Log.h"
#include "UpdateData.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "UpdateData.h"
#include "WorldPacket.h"
Bag::Bag(): Item()
{

View File

@@ -25,6 +25,7 @@
#include "SpellAuras.h"
#include "UpdateData.h"
#include "Util.h"
#include "WorldPacket.h"
SceneObject::SceneObject() : WorldObject(false)
{

View File

@@ -29,6 +29,7 @@
#include "Totem.h"
#include "UpdateData.h"
#include "Vehicle.h"
#include "WorldPacket.h"
#include <boost/dynamic_bitset.hpp>
#include <sstream>

View File

@@ -275,12 +275,6 @@ void CharmInfo::LoadPetActionBar(const std::string& data)
}
}
void CharmInfo::BuildActionBar(WorldPacket* data)
{
for (uint32 i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i)
*data << uint32(PetActionBar[i].packedData);
}
void CharmInfo::SetSpellAutocast(SpellInfo const* spellInfo, bool state)
{
for (uint8 i = 0; i < MAX_UNIT_ACTION_BAR_INDEX; ++i)

View File

@@ -23,7 +23,6 @@
class SpellInfo;
class Unit;
class WorldPacket;
constexpr uint8 MAX_SPELL_CHARM = 4;
constexpr uint8 MAX_SPELL_VEHICLE = 6;
@@ -107,7 +106,6 @@ struct TC_GAME_API CharmInfo
bool AddSpellToActionBar(SpellInfo const* spellInfo, ActiveStates newstate = ACT_DECIDE, uint8 preferredSlot = 0);
bool RemoveSpellFromActionBar(uint32 spell_id);
void LoadPetActionBar(const std::string& data);
void BuildActionBar(WorldPacket* data);
void SetSpellAutocast(SpellInfo const* spellInfo, bool state);
void SetActionBar(uint8 index, uint32 spellOrAction, ActiveStates type)
{

View File

@@ -11001,8 +11001,11 @@ void ObjectMgr::InitializeQueriesData(QueryDataGroup mask)
void QuestPOIData::InitializeQueryData()
{
QueryDataBuffer << *this;
QueryDataBuffer.shrink_to_fit();
ByteBuffer tempBuffer;
tempBuffer << *this;
tempBuffer.shrink_to_fit();
QueryDataBuffer = std::move(tempBuffer).Release();
}
void ObjectMgr::LoadSceneTemplates()

View File

@@ -822,7 +822,7 @@ struct QuestPOIData
std::vector<QuestPOIBlobData> Blobs;
void InitializeQueryData();
ByteBuffer QueryDataBuffer;
std::vector<uint8> QueryDataBuffer;
};
typedef std::unordered_map<uint32, QuestPOIData> QuestPOIContainer;

View File

@@ -78,7 +78,7 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe
Difficulty difficulty = _player->GetMap()->GetDifficultyID();
// Cache only exists for difficulty base
if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES) && difficulty == DIFFICULTY_NONE)
if (ci->QueryData && difficulty == DIFFICULTY_NONE)
SendPacket(&ci->QueryData[static_cast<uint32>(GetSessionDbLocaleIndex())]);
else
{
@@ -103,7 +103,7 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj
{
if (GameObjectTemplate const* info = sObjectMgr->GetGameObjectTemplate(packet.GameObjectID))
{
if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES))
if (info->QueryData)
SendPacket(&info->QueryData[static_cast<uint32>(GetSessionDbLocaleIndex())]);
else
{

View File

@@ -650,6 +650,8 @@ bool Quest::CanIncreaseRewardedQuestCounters() const
void Quest::InitializeQueryData()
{
QueryData = std::make_unique<WorldPacket[]>(TOTAL_LOCALES);
for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
{
if (!sWorld->getBoolConfig(CONFIG_LOAD_LOCALES) && loc != DEFAULT_LOCALE)

View File

@@ -27,12 +27,12 @@
#include "RaceMask.h"
#include "SharedDefines.h"
#include "UniqueTrackablePtr.h"
#include "WorldPacket.h"
#include <bitset>
#include <unordered_set>
#include <vector>
class Player;
class WorldPacket;
enum Difficulty : int16;
namespace WorldPackets
@@ -778,7 +778,7 @@ class TC_GAME_API Quest
std::vector<uint32> DependentPreviousQuests;
std::vector<uint32> DependentBreadcrumbQuests;
std::array<WorldPacket, TOTAL_LOCALES> QueryData;
std::unique_ptr<WorldPacket[]> QueryData;
private:
uint32 _rewItemsCount = 0;

View File

@@ -427,12 +427,10 @@ WorldPacket const* QuestPOIQueryResponse::Write()
_worldPacket << Size<int32>(QuestPOIDataStats);
_worldPacket << Size<int32>(QuestPOIDataStats);
bool useCache = sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES);
for (QuestPOIData const* questPOIData : QuestPOIDataStats)
{
if (useCache)
_worldPacket.append(questPOIData->QueryDataBuffer);
if (!questPOIData->QueryDataBuffer.empty())
_worldPacket.append(questPOIData->QueryDataBuffer.data(), questPOIData->QueryDataBuffer.size());
else
_worldPacket << *questPOIData;
}

View File

@@ -21,12 +21,13 @@
#include "ItemDefines.h"
#include "ItemTemplate.h"
#include "ObjectMgr.h"
#include <cstring> // std::memset
/*static*/ ItemTemplate& UnitTestDataLoader::GetItemTemplate(uint32 itemId, std::string_view name)
{
ItemTemplate& t = sObjectMgr->_itemTemplateStore[itemId];
ItemEntry* itemEntry = new ItemEntry();
memset(itemEntry, 0, sizeof(ItemEntry));
std::memset(itemEntry, 0, sizeof(ItemEntry));
itemEntry->ID = itemId;
itemEntry->ClassID = ITEM_CLASS_MISCELLANEOUS;
t.BasicData = itemEntry;