From 68111e356946653cf8152274933ada4c32c8ae99 Mon Sep 17 00:00:00 2001 From: Miepee Date: Mon, 10 Jun 2024 11:25:29 +0200 Subject: [PATCH 1/2] Memory Optimization to not resize a dictionary --- UndertaleModLib/Compiler/Compiler.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/UndertaleModLib/Compiler/Compiler.cs b/UndertaleModLib/Compiler/Compiler.cs index 8a665ecf4..bf01cb287 100644 --- a/UndertaleModLib/Compiler/Compiler.cs +++ b/UndertaleModLib/Compiler/Compiler.cs @@ -106,7 +106,25 @@ public void Setup(bool redoAssets = false) private void MakeAssetDictionary() { + // Clear the dictionary first and set the worst case max size so that we don't resize it over and over assetIds.Clear(); + int maxSize = 0; + maxSize += Data?.GameObjects?.Count ?? 0; + maxSize += Data?.Sprites?.Count ?? 0; + maxSize += Data?.Sounds?.Count ?? 0; + maxSize += Data?.Backgrounds?.Count ?? 0; + maxSize += Data?.Paths?.Count ?? 0; + maxSize += Data?.Fonts?.Count ?? 0; + maxSize += Data?.Timelines?.Count ?? 0; + maxSize += Data?.Scripts?.Count ?? 0; + maxSize += Data?.Shaders?.Count ?? 0; + maxSize += Data?.Rooms?.Count ?? 0; + maxSize += Data?.AudioGroups?.Count ?? 0; + maxSize += Data?.AnimationCurves?.Count ?? 0; + maxSize += Data?.Sequences?.Count ?? 0; + maxSize += Data?.ParticleSystems?.Count ?? 0; + assetIds.EnsureCapacity(maxSize); + AddAssetsFromList(Data?.GameObjects, AssetRefType.Object); AddAssetsFromList(Data?.Sprites, AssetRefType.Sprite); AddAssetsFromList(Data?.Sounds, AssetRefType.Sound); From e3042d05bbea1469bb3b6c412bbf8102a60a3259 Mon Sep 17 00:00:00 2001 From: Miepee <38186597+Miepee@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:12:11 +0200 Subject: [PATCH 2/2] early return if Data is null --- UndertaleModLib/Compiler/Compiler.cs | 66 +++++++++++++++------------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/UndertaleModLib/Compiler/Compiler.cs b/UndertaleModLib/Compiler/Compiler.cs index bf01cb287..bc66d386c 100644 --- a/UndertaleModLib/Compiler/Compiler.cs +++ b/UndertaleModLib/Compiler/Compiler.cs @@ -108,48 +108,52 @@ private void MakeAssetDictionary() { // Clear the dictionary first and set the worst case max size so that we don't resize it over and over assetIds.Clear(); + scripts.Clear(); + if (Data is null) return; + int maxSize = 0; - maxSize += Data?.GameObjects?.Count ?? 0; - maxSize += Data?.Sprites?.Count ?? 0; - maxSize += Data?.Sounds?.Count ?? 0; - maxSize += Data?.Backgrounds?.Count ?? 0; - maxSize += Data?.Paths?.Count ?? 0; - maxSize += Data?.Fonts?.Count ?? 0; - maxSize += Data?.Timelines?.Count ?? 0; - maxSize += Data?.Scripts?.Count ?? 0; - maxSize += Data?.Shaders?.Count ?? 0; - maxSize += Data?.Rooms?.Count ?? 0; - maxSize += Data?.AudioGroups?.Count ?? 0; - maxSize += Data?.AnimationCurves?.Count ?? 0; - maxSize += Data?.Sequences?.Count ?? 0; - maxSize += Data?.ParticleSystems?.Count ?? 0; + maxSize += Data.GameObjects?.Count ?? 0; + maxSize += Data.Sprites?.Count ?? 0; + maxSize += Data.Sounds?.Count ?? 0; + maxSize += Data.Backgrounds?.Count ?? 0; + maxSize += Data.Paths?.Count ?? 0; + maxSize += Data.Fonts?.Count ?? 0; + maxSize += Data.Timelines?.Count ?? 0; + maxSize += Data.Scripts?.Count ?? 0; + maxSize += Data.Shaders?.Count ?? 0; + maxSize += Data.Rooms?.Count ?? 0; + maxSize += Data.AudioGroups?.Count ?? 0; + maxSize += Data.AnimationCurves?.Count ?? 0; + maxSize += Data.Sequences?.Count ?? 0; + maxSize += Data.ParticleSystems?.Count ?? 0; + assetIds.EnsureCapacity(maxSize); + scripts.EnsureCapacity(Data.Scripts?.Count ?? 0); - AddAssetsFromList(Data?.GameObjects, AssetRefType.Object); - AddAssetsFromList(Data?.Sprites, AssetRefType.Sprite); - AddAssetsFromList(Data?.Sounds, AssetRefType.Sound); - AddAssetsFromList(Data?.Backgrounds, AssetRefType.Background); - AddAssetsFromList(Data?.Paths, AssetRefType.Path); - AddAssetsFromList(Data?.Fonts, AssetRefType.Font); - AddAssetsFromList(Data?.Timelines, AssetRefType.Timeline); + AddAssetsFromList(Data.GameObjects, AssetRefType.Object); + AddAssetsFromList(Data.Sprites, AssetRefType.Sprite); + AddAssetsFromList(Data.Sounds, AssetRefType.Sound); + AddAssetsFromList(Data.Backgrounds, AssetRefType.Background); + AddAssetsFromList(Data.Paths, AssetRefType.Path); + AddAssetsFromList(Data.Fonts, AssetRefType.Font); + AddAssetsFromList(Data.Timelines, AssetRefType.Timeline); if (!GMS2_3) - AddAssetsFromList(Data?.Scripts, AssetRefType.Object /* not actually used */); - AddAssetsFromList(Data?.Shaders, AssetRefType.Shader); - AddAssetsFromList(Data?.Rooms, AssetRefType.Room); - AddAssetsFromList(Data?.AudioGroups, AssetRefType.Sound /* apparently? */); - AddAssetsFromList(Data?.AnimationCurves, AssetRefType.AnimCurve); - AddAssetsFromList(Data?.Sequences, AssetRefType.Sequence); - AddAssetsFromList(Data?.ParticleSystems, AssetRefType.ParticleSystem); + AddAssetsFromList(Data.Scripts, AssetRefType.Object /* not actually used */); + AddAssetsFromList(Data.Shaders, AssetRefType.Shader); + AddAssetsFromList(Data.Rooms, AssetRefType.Room); + AddAssetsFromList(Data.AudioGroups, AssetRefType.Sound /* apparently? */); + AddAssetsFromList(Data.AnimationCurves, AssetRefType.AnimCurve); + AddAssetsFromList(Data.Sequences, AssetRefType.Sequence); + AddAssetsFromList(Data.ParticleSystems, AssetRefType.ParticleSystem); - scripts.Clear(); - if (Data?.Scripts != null) + if (Data.Scripts is not null) { foreach (UndertaleScript s in Data.Scripts) { scripts.Add(s.Name.Content); } } - if (Data?.Extensions != null) + if (Data.Extensions is not null) { foreach (UndertaleExtension e in Data.Extensions) {