Skip to content

Commit 2a0695e

Browse files
runtime-"cache" performance improvement
1 parent ddefde9 commit 2a0695e

File tree

3 files changed

+29
-11
lines changed

3 files changed

+29
-11
lines changed

SynthesisRPGLoot/Analyzers/ArmorAnalyzer.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public ArmorAnalyzer(IPatcherState<ISkyrimMod, ISkyrimModGetter> state,
5252
{
5353
ChosenRpgEnchantEffects[i] = new();
5454
}
55+
56+
GeneratedItemCache = new();
57+
GeneratedLeveledItemsCache = new();
5558
}
5659

5760
protected override void AnalyzeGear()
@@ -178,7 +181,7 @@ protected override FormKey EnchantItem(ResolvedListItem<IArmorGetter> item, int
178181
var newArmorEditorId = EditorIdPrefix + RarityClasses[rarity].Label.ToUpper() + "_" +
179182
itemName +
180183
"_of_" + GetEnchantmentsStringForName(effects, true);
181-
if (State.LinkCache.TryResolve<IArmorGetter>(newArmorEditorId, out var armorGetter))
184+
if (GeneratedItemCache.TryGetValue(newArmorEditorId, out var armorGetter))
182185
{
183186
return armorGetter.FormKey;
184187
}
@@ -198,6 +201,8 @@ protected override FormKey EnchantItem(ResolvedListItem<IArmorGetter> item, int
198201
newArmor.Keywords?.Add(Skyrim.Keyword.MagicDisallowEnchanting);
199202
}
200203

204+
GeneratedItemCache.Add(newArmor.EditorID, newArmor);
205+
201206
if (Program.Settings.GeneralSettings.LogGeneratedItems)
202207
Console.WriteLine($"Generated {newArmor.Name}");
203208

@@ -206,7 +211,7 @@ protected override FormKey EnchantItem(ResolvedListItem<IArmorGetter> item, int
206211
else
207212
{
208213
var newArmorEditorId = EditorIdPrefix + item.Resolved.EditorID;
209-
if (State.LinkCache.TryResolve<IArmorGetter>(newArmorEditorId, out var armorGetter))
214+
if (GeneratedItemCache.TryGetValue(newArmorEditorId, out var armorGetter))
210215
{
211216
return State.PatchMod.Armors.GetOrAddAsOverride(armorGetter).FormKey;
212217
}
@@ -219,6 +224,8 @@ protected override FormKey EnchantItem(ResolvedListItem<IArmorGetter> item, int
219224
? itemName
220225
: RarityClasses[rarity].Label + " " + itemName;
221226

227+
GeneratedItemCache.Add(newArmor.EditorID, newArmor);
228+
222229
if (Program.Settings.GeneralSettings.LogGeneratedItems)
223230
Console.WriteLine($"Generated {newArmor.Name}");
224231

SynthesisRPGLoot/Analyzers/GearAnalyzer.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ public abstract class GearAnalyzer<TType>
6868

6969
protected string ItemTypeDescriptor;
7070

71+
protected Dictionary<string, ILeveledItemGetter> GeneratedLeveledItemsCache { get; init; }
72+
73+
protected Dictionary<string, TType> GeneratedItemCache { get; init; }
7174

7275
public void Analyze()
7376
{
@@ -157,7 +160,7 @@ public void Generate()
157160
var levelForName = ench.Entry.Data.Level;
158161
var topLevelListEditorId = $"HAL_TOP_LList_{ench.Resolved.EditorID}_Level_{levelForName}";
159162
LeveledItem topLevelList;
160-
if (State.LinkCache.TryResolve<ILeveledItemGetter>(topLevelListEditorId, out var topLeveledListGetter))
163+
if (GeneratedLeveledItemsCache.TryGetValue(topLevelListEditorId, out var topLeveledListGetter))
161164
{
162165
topLevelList = State.PatchMod.LeveledItems.GetOrAddAsOverride(topLeveledListGetter);
163166
}
@@ -168,6 +171,8 @@ public void Generate()
168171
topLevelList.Entries = [];
169172
topLevelList.EditorID = topLevelListEditorId;
170173
topLevelList.Flags = GetLeveledItemFlags();
174+
175+
GeneratedLeveledItemsCache.Add(topLevelList.EditorID,topLevelList);
171176

172177
for (var i = 0; i < GearSettings.BaseItemChanceWeight; i++)
173178
{
@@ -183,7 +188,7 @@ public void Generate()
183188
var leveledItemEditorId =
184189
$"HAL_SUB_LList_{rarityClass.Label}_{ench.Resolved.EditorID}_Level_{levelForName}";
185190
LeveledItem leveledItem;
186-
if (State.LinkCache.TryResolve<ILeveledItemGetter>(leveledItemEditorId,
191+
if (GeneratedLeveledItemsCache.TryGetValue(leveledItemEditorId,
187192
out var leveledItemGetter))
188193
{
189194
leveledItem = State.PatchMod.LeveledItems.GetOrAddAsOverride(leveledItemGetter);
@@ -195,6 +200,8 @@ public void Generate()
195200
leveledItem.Entries = [];
196201
leveledItem.EditorID = leveledItemEditorId;
197202
leveledItem.Flags = GetLeveledItemFlags();
203+
204+
GeneratedLeveledItemsCache[leveledItem.EditorID] = leveledItem;
198205

199206
for (var i = 0; i < VarietyCountPerRarity; i++)
200207
{
@@ -247,11 +254,6 @@ protected FormKey GenerateEnchantment(int rarity)
247254
var objectEffectEditorId = EditorIdPrefix + "ENCH_" + RarityClasses[rarity].Label.ToUpper() + "_" +
248255
GetEnchantmentsStringForName(effects, true);
249256

250-
if (State.LinkCache.TryResolve<IObjectEffectGetter>(objectEffectEditorId, out var objectEffectGetter))
251-
{
252-
return objectEffectGetter.FormKey;
253-
}
254-
255257
var newObjectEffectGetter = State.PatchMod.ObjectEffects.AddNewLocking(State.PatchMod.GetNextFormKey());
256258
newObjectEffectGetter.DeepCopyIn(effects.First().Enchantment);
257259
newObjectEffectGetter.EditorID = objectEffectEditorId;
@@ -264,6 +266,7 @@ protected FormKey GenerateEnchantment(int rarity)
264266
ChosenRpgEnchants[rarity].Add(RarityClasses[rarity].Label + " " + GetEnchantmentsStringForName(effects),
265267
newObjectEffectGetter.FormKey);
266268
ChosenRpgEnchantEffects[rarity].Add(newObjectEffectGetter.FormKey, effects);
269+
267270
return newObjectEffectGetter.FormKey;
268271
}
269272

SynthesisRPGLoot/Analyzers/WeaponAnalyzer.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public WeaponAnalyzer(IPatcherState<ISkyrimMod, ISkyrimModGetter> state,
5252
{
5353
ChosenRpgEnchantEffects[i] = new();
5454
}
55+
56+
GeneratedItemCache = new();
57+
GeneratedLeveledItemsCache = new();
5558
}
5659

5760
protected override void AnalyzeGear()
@@ -178,7 +181,7 @@ protected override FormKey EnchantItem(ResolvedListItem<IWeaponGetter> item, int
178181
var newWeaponEditorId = EditorIdPrefix + RarityClasses[rarity].Label.ToUpper() + "_" +
179182
itemName +
180183
"_of_" + GetEnchantmentsStringForName(effects, true);
181-
if (State.LinkCache.TryResolve<IWeaponGetter>(newWeaponEditorId, out var weaponGetter))
184+
if (GeneratedItemCache.TryGetValue(newWeaponEditorId, out var weaponGetter))
182185
{
183186
return weaponGetter.FormKey;
184187
}
@@ -198,6 +201,8 @@ protected override FormKey EnchantItem(ResolvedListItem<IWeaponGetter> item, int
198201
newWeapon.Keywords?.Add(Skyrim.Keyword.MagicDisallowEnchanting);
199202
}
200203

204+
GeneratedItemCache.Add(newWeapon.EditorID, newWeapon);
205+
201206
if (Program.Settings.GeneralSettings.LogGeneratedItems)
202207
Console.WriteLine($"Generated {newWeapon.Name}");
203208

@@ -206,10 +211,11 @@ protected override FormKey EnchantItem(ResolvedListItem<IWeaponGetter> item, int
206211
else
207212
{
208213
var newWeaponEditorId = EditorIdPrefix + item.Resolved.EditorID;
209-
if (State.LinkCache.TryResolve<IWeaponGetter>(newWeaponEditorId, out var weaponGetter))
214+
if (GeneratedItemCache.TryGetValue(newWeaponEditorId, out var weaponGetter))
210215
{
211216
return weaponGetter.FormKey;
212217
}
218+
213219
var newWeapon = State.PatchMod.Weapons.AddNewLocking(State.PatchMod.GetNextFormKey());
214220
newWeapon.DeepCopyIn(item.Resolved);
215221
newWeapon.EditorID = newWeaponEditorId;
@@ -218,6 +224,8 @@ protected override FormKey EnchantItem(ResolvedListItem<IWeaponGetter> item, int
218224
? itemName
219225
: RarityClasses[rarity].Label + " " + itemName;
220226

227+
GeneratedItemCache.Add(newWeapon.EditorID, newWeapon);
228+
221229
if (Program.Settings.GeneralSettings.LogGeneratedItems)
222230
Console.WriteLine($"Generated {newWeapon.Name}");
223231

0 commit comments

Comments
 (0)