From 7604e9cf8afffcc0557152ded21ce4ae87f9f95f Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 19 May 2024 21:41:19 -0700 Subject: [PATCH] perf: Dictionary allocations for the definition scriptable objects creation/caching, and skipping unnessesary ContainsKey --- .../LDtkDefinitionObjectsCache.cs | 33 +++++++++++++------ .../Assets/LDtkArtifactAssetsTileset.cs | 17 ++++------ 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Assets/LDtkUnity/Runtime/Data/Extensions/Definition/ScriptableObjects/LDtkDefinitionObjectsCache.cs b/Assets/LDtkUnity/Runtime/Data/Extensions/Definition/ScriptableObjects/LDtkDefinitionObjectsCache.cs index 364e77bba..ba9b19a89 100644 --- a/Assets/LDtkUnity/Runtime/Data/Extensions/Definition/ScriptableObjects/LDtkDefinitionObjectsCache.cs +++ b/Assets/LDtkUnity/Runtime/Data/Extensions/Definition/ScriptableObjects/LDtkDefinitionObjectsCache.cs @@ -18,10 +18,10 @@ namespace LDtkUnity /// internal class LDtkDefinitionObjectsCache { - private readonly Dictionary _defsDict = new Dictionary(); private readonly LDtkDebugInstance _logger; - - internal List Defs = new List(); + + private Dictionary _defsDict; + internal List Defs; //key: tilesetuid, value: rectangle to sprite ref private Dictionary> _allSprites; @@ -49,8 +49,8 @@ public void InitializeFromProject(Definitions defs, Dictionary defs, Dictionary tiles _allSprites = new Dictionary>(tilesets.Count); foreach (var pair in tilesets) { - Dictionary dict = pair.Value != null ? pair.Value.AllSpritesToConvertedDict() : new Dictionary(); + Dictionary dict; + if (pair.Value != null) + { + LDtkProfiler.BeginSample("AllSpritesToConvertedDict"); + dict = pair.Value.AllSpritesToConvertedDict(); + LDtkProfiler.EndSample(); + } + else + { + dict = new Dictionary(); + } _allSprites.Add(pair.Key, dict); } } private void GenerateObjects(Definitions defs) { + _defsDict = new Dictionary(defs.Entities.Length + defs.Enums.Length + defs.ExternalEnums.Length + defs.Layers.Length + defs.LevelFields.Length + defs.Tilesets.Length); foreach (EntityDefinition def in defs.Entities) { _defsDict.Add(def.Uid, ScriptableObject.CreateInstance()); @@ -238,16 +249,18 @@ public Sprite GetSpriteForTilesetRectangle(TilesetRectangle rectangle) return sprite; } - private void CacheDictToList() + private void CacheDictToListViaProject() { + Defs = new List(_defsDict.Count); foreach (LDtkDefinitionObject def in _defsDict.Values) { Defs.Add(def); } } - private void CacheListToDict() + private void CacheListToDictViaLevel() { + _defsDict = new Dictionary(Defs.Count); foreach (LDtkDefinitionObject def in Defs) { if (def is ILDtkUid uid) diff --git a/Assets/LDtkUnity/Runtime/UnityAssets/Assets/LDtkArtifactAssetsTileset.cs b/Assets/LDtkUnity/Runtime/UnityAssets/Assets/LDtkArtifactAssetsTileset.cs index c0957c8f0..50192b7f3 100644 --- a/Assets/LDtkUnity/Runtime/UnityAssets/Assets/LDtkArtifactAssetsTileset.cs +++ b/Assets/LDtkUnity/Runtime/UnityAssets/Assets/LDtkArtifactAssetsTileset.cs @@ -52,29 +52,24 @@ public sealed class LDtkArtifactAssetsTileset : ScriptableObject internal Dictionary AllSpritesToConvertedDict() { - //List sprites = _sprites.Concat(_additionalSprites).Distinct().ToList(); - - Dictionary dict = new Dictionary(); + int capacity = _sprites.Count + _additionalSprites.Count; + Dictionary dict = new Dictionary(capacity); foreach (Sprite sprite in _sprites) { - PutToDict(sprite); + Rect convertedRect = LDtkCoordConverter.ImageSlice(sprite.rect, sprite.texture.height); + dict.Add(convertedRect, sprite); } foreach (Sprite sprite in _additionalSprites) - { - PutToDict(sprite); - } - return dict; - - void PutToDict(Sprite sprite) { Rect convertedRect = LDtkCoordConverter.ImageSlice(sprite.rect, sprite.texture.height); - if (!dict.ContainsKey(convertedRect)) { dict.Add(convertedRect, sprite); } } + return dict; } + internal Dictionary SpritesToDict() { return _sprites.ToDictionary(sprite => sprite.rect);