From 3a5c74fcd112c86622116bf25f6d9962d3e4144d Mon Sep 17 00:00:00 2001 From: Aaron Kimbrell Date: Tue, 29 Sep 2026 19:44:44 -0500 Subject: [PATCH] perf(cdclient): keep ComponentsRegistry and ItemComponent in memory Every entity and every inventory item looks these up, and an id not seen yet was a full scan of the unindexed table, so a character holding about 3000 different items took a minute to load (the client waited at 35%). Loading both tables once at startup costs a few MB per server. Co-Authored-By: Claude Opus 5.5 --- dDatabase/CDClientDatabase/CDClientManager.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dDatabase/CDClientDatabase/CDClientManager.cpp b/dDatabase/CDClientDatabase/CDClientManager.cpp index 426a4f621..af1d8c596 100644 --- a/dDatabase/CDClientDatabase/CDClientManager.cpp +++ b/dDatabase/CDClientDatabase/CDClientManager.cpp @@ -123,7 +123,10 @@ void CDClientManager::LoadValuesFromDatabase() { CDBehaviorTemplateTable::Instance().LoadValuesFromDatabase(); CDBrickIDTableTable::Instance().LoadValuesFromDatabase(); CDCollectibleComponentTable::Instance().LoadValuesFromDatabase(); - CDCLIENT_DONT_CACHE_TABLE(CDComponentsRegistryTable::Instance().LoadValuesFromDatabase()); + // Always in memory: every entity and every inventory item asks for its components and item data, and looking up an + // id not seen yet in the unindexed CDClient scans the whole table (a character holding 3000 different items took a + // minute to load) + CDComponentsRegistryTable::Instance().LoadValuesFromDatabase(); CDCurrencyTableTable::Instance().LoadValuesFromDatabase(); CDDeletionRestrictionsTable::Instance().LoadValuesFromDatabase(); CDDestructibleComponentTable::Instance().LoadValuesFromDatabase(); @@ -131,7 +134,7 @@ void CDClientManager::LoadValuesFromDatabase() { CDEventGatingTable::Instance().LoadValuesFromDatabase(); CDFeatureGatingTable::Instance().LoadValuesFromDatabase(); CDInventoryComponentTable::Instance().LoadValuesFromDatabase(); - CDCLIENT_DONT_CACHE_TABLE(CDItemComponentTable::Instance().LoadValuesFromDatabase()); + CDItemComponentTable::Instance().LoadValuesFromDatabase(); CDItemSetSkillsTable::Instance().LoadValuesFromDatabase(); CDItemSetsTable::Instance().LoadValuesFromDatabase(); CDLevelProgressionLookupTable::Instance().LoadValuesFromDatabase();