Skip to content

Commit 0575479

Browse files
committed
Change EmbeddedPresetHolder data layout to make searches faster
1 parent 126d084 commit 0575479

File tree

1 file changed

+64
-33
lines changed

1 file changed

+64
-33
lines changed

Runtime/Internal/EmbeddedPresetHolder.cs

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace Gilzoide.ConditionalObjects
1111
{
1212
public class EmbeddedPresetHolder : ScriptableObject
1313
{
14+
#region Instance
15+
1416
public static readonly string InstanceAssetPath = $"Assets/ConditionalObjects/Editor/{nameof(EmbeddedPresetHolder)}.asset";
1517

1618
public static EmbeddedPresetHolder Instance => _instance ? _instance : (_instance = GetOrCreateInstance());
@@ -33,69 +35,98 @@ static EmbeddedPresetHolder GetOrCreateInstance()
3335
return instance;
3436
}
3537

38+
#endregion
39+
3640
[Serializable]
37-
public class EmbeddedPreset
41+
internal class EmbeddedPresets : IComparable<EmbeddedPresets>
3842
{
3943
public GUID AssetGuid;
40-
public Preset Preset;
44+
public List<Preset> PresetList;
45+
46+
public int CompareTo(EmbeddedPresets other)
47+
{
48+
return AssetGuid.CompareTo(other.AssetGuid);
49+
}
4150
}
4251

43-
[SerializeField] private List<EmbeddedPreset> _embeddedPresets = new List<EmbeddedPreset>();
52+
[SerializeField] private List<EmbeddedPresets> _embeddedPresets = new List<EmbeddedPresets>();
4453

4554
public Preset CreatePreset(GameObject ownerObject, Object target)
4655
{
4756
string assetPath = ownerObject.GetAssetPath();
48-
return CreatePreset(AssetDatabase.AssetPathToGUID(assetPath), target);
57+
return CreatePreset(assetPath, target);
58+
}
59+
60+
public void HandleAssetDelete(string assetPath)
61+
{
62+
RemoveEmbeddedPresets(assetPath);
4963
}
5064

51-
public Preset CreatePreset(string assetGuid, Object target)
65+
public void DeleteOrphanPresets(string assetPath, HashSet<Preset> referencedPresets)
5266
{
53-
if (string.IsNullOrEmpty(AssetDatabase.GUIDToAssetPath(assetGuid)))
67+
GetEmbeddedPresets(assetPath)?.PresetList.RemoveAll(p =>
5468
{
55-
throw new ArgumentOutOfRangeException(nameof(assetGuid), "GUID is not know in AssetDatabase");
56-
}
69+
bool shouldRemove = !referencedPresets.Contains(p);
70+
if (shouldRemove)
71+
{
72+
DestroyImmediate(p, true);
73+
}
74+
return shouldRemove;
75+
});
76+
}
5777

78+
private Preset CreatePreset(string assetPath, Object target)
79+
{
80+
var guid = new GUID(AssetDatabase.AssetPathToGUID(assetPath));
5881
var preset = new Preset(target)
5982
{
60-
name = $"{assetGuid}-{GlobalObjectId.GetGlobalObjectIdSlow(target).targetObjectId}",
83+
name = $"{guid}-{GlobalObjectId.GetGlobalObjectIdSlow(target).targetObjectId}",
84+
hideFlags = HideFlags.HideInHierarchy,
6185
};
6286
preset.ExcludeAllProperties();
63-
_embeddedPresets.Add(new EmbeddedPreset
64-
{
65-
AssetGuid = new GUID(assetGuid),
66-
Preset = preset,
67-
});
6887
AssetDatabase.AddObjectToAsset(preset, this);
69-
AssetDatabase.SaveAssetIfDirty(this);
88+
GetOrCreateEmbeddedPresets(assetPath).PresetList.Add(preset);
7089
return preset;
7190
}
7291

73-
public void HandleAssetDelete(string assetPath)
92+
private EmbeddedPresets GetEmbeddedPresets(string assetPath)
7493
{
7594
var guid = new GUID(AssetDatabase.AssetPathToGUID(assetPath));
76-
_embeddedPresets.RemoveAll(p =>
95+
int index = _embeddedPresets.BinarySearch(new EmbeddedPresets { AssetGuid = guid });
96+
if (index >= 0)
7797
{
78-
bool shouldRemove = p.AssetGuid == guid;
79-
if (shouldRemove)
80-
{
81-
DestroyImmediate(p.Preset, true);
82-
}
83-
return shouldRemove;
84-
});
98+
return _embeddedPresets[index];
99+
}
100+
else
101+
{
102+
return null;
103+
}
85104
}
86105

87-
public void DeleteOrphanPresets(string assetPath, HashSet<Preset> referencedPresets)
106+
private EmbeddedPresets GetOrCreateEmbeddedPresets(string assetPath)
88107
{
89108
var guid = new GUID(AssetDatabase.AssetPathToGUID(assetPath));
90-
_embeddedPresets.RemoveAll(p =>
109+
int index = _embeddedPresets.BinarySearch(new EmbeddedPresets { AssetGuid = guid });
110+
if (index >= 0)
91111
{
92-
bool shouldRemove = p.AssetGuid == guid && !referencedPresets.Contains(p.Preset);
93-
if (shouldRemove)
94-
{
95-
DestroyImmediate(p.Preset, true);
96-
}
97-
return shouldRemove;
98-
});
112+
return _embeddedPresets[index];
113+
}
114+
else
115+
{
116+
var embeddedPreset = new EmbeddedPresets { AssetGuid = guid, PresetList = new List<Preset>() };
117+
_embeddedPresets.Insert(~index, embeddedPreset);
118+
return embeddedPreset;
119+
}
120+
}
121+
122+
private void RemoveEmbeddedPresets(string assetPath)
123+
{
124+
var guid = new GUID(AssetDatabase.AssetPathToGUID(assetPath));
125+
int index = _embeddedPresets.BinarySearch(new EmbeddedPresets { AssetGuid = guid });
126+
if (index >= 0)
127+
{
128+
_embeddedPresets.RemoveAt(index);
129+
}
99130
}
100131
}
101132
}

0 commit comments

Comments
 (0)