Skip to content

Commit

Permalink
perf: Dictionary allocations for the definition scriptable objects cr…
Browse files Browse the repository at this point in the history
…eation/caching, and skipping unnessesary ContainsKey
  • Loading branch information
Cammin committed May 20, 2024
1 parent 6a16b88 commit 7604e9c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ namespace LDtkUnity
/// </summary>
internal class LDtkDefinitionObjectsCache
{
private readonly Dictionary<int, LDtkDefinitionObject> _defsDict = new Dictionary<int, LDtkDefinitionObject>();
private readonly LDtkDebugInstance _logger;

internal List<LDtkDefinitionObject> Defs = new List<LDtkDefinitionObject>();

private Dictionary<int, LDtkDefinitionObject> _defsDict;
internal List<LDtkDefinitionObject> Defs;

//key: tilesetuid, value: rectangle to sprite ref
private Dictionary<int, Dictionary<Rect,Sprite>> _allSprites;
Expand Down Expand Up @@ -49,8 +49,8 @@ public void InitializeFromProject(Definitions defs, Dictionary<int, LDtkArtifact
SetObjectNames();
LDtkProfiler.EndSample();

LDtkProfiler.BeginSample("CacheDictToList");
CacheDictToList();
LDtkProfiler.BeginSample("CacheDictToListViaProject");
CacheDictToListViaProject();
LDtkProfiler.EndSample();
}

Expand All @@ -62,8 +62,8 @@ public void InitializeFromLevel(List<LDtkDefinitionObject> defs, Dictionary<int,

Defs = defs;

Profiler.BeginSample("CacheListToDict");
CacheListToDict();
Profiler.BeginSample("CacheListToDictViaLevel");
CacheListToDictViaLevel();
Profiler.EndSample();
}

Expand All @@ -72,13 +72,24 @@ private void InitializeTilesets(Dictionary<int, LDtkArtifactAssetsTileset> tiles
_allSprites = new Dictionary<int, Dictionary<Rect,Sprite>>(tilesets.Count);
foreach (var pair in tilesets)
{
Dictionary<Rect,Sprite> dict = pair.Value != null ? pair.Value.AllSpritesToConvertedDict() : new Dictionary<Rect, Sprite>();
Dictionary<Rect, Sprite> dict;
if (pair.Value != null)
{
LDtkProfiler.BeginSample("AllSpritesToConvertedDict");
dict = pair.Value.AllSpritesToConvertedDict();
LDtkProfiler.EndSample();
}
else
{
dict = new Dictionary<Rect, Sprite>();
}
_allSprites.Add(pair.Key, dict);
}
}

private void GenerateObjects(Definitions defs)
{
_defsDict = new Dictionary<int, LDtkDefinitionObject>(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<LDtkDefinitionObjectEntity>());
Expand Down Expand Up @@ -238,16 +249,18 @@ public Sprite GetSpriteForTilesetRectangle(TilesetRectangle rectangle)
return sprite;
}

private void CacheDictToList()
private void CacheDictToListViaProject()
{
Defs = new List<LDtkDefinitionObject>(_defsDict.Count);
foreach (LDtkDefinitionObject def in _defsDict.Values)
{
Defs.Add(def);
}
}

private void CacheListToDict()
private void CacheListToDictViaLevel()
{
_defsDict = new Dictionary<int, LDtkDefinitionObject>(Defs.Count);
foreach (LDtkDefinitionObject def in Defs)
{
if (def is ILDtkUid uid)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,29 +52,24 @@ public sealed class LDtkArtifactAssetsTileset : ScriptableObject

internal Dictionary<Rect, Sprite> AllSpritesToConvertedDict()
{
//List<Sprite> sprites = _sprites.Concat(_additionalSprites).Distinct().ToList();

Dictionary<Rect,Sprite> dict = new Dictionary<Rect, Sprite>();
int capacity = _sprites.Count + _additionalSprites.Count;
Dictionary<Rect,Sprite> dict = new Dictionary<Rect, Sprite>(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<Rect, Sprite> SpritesToDict()
{
return _sprites.ToDictionary(sprite => sprite.rect);
Expand Down

0 comments on commit 7604e9c

Please sign in to comment.