diff options
author | chai <chaifix@163.com> | 2021-04-07 21:33:14 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-04-07 21:33:14 +0800 |
commit | c47b92e92cf33ae8bf2f38929e137294397e4735 (patch) | |
tree | c67ae3419eaf15e84f1679186e107f598de33978 /Assets/Scripts/Common/MaterialCache.cs |
Diffstat (limited to 'Assets/Scripts/Common/MaterialCache.cs')
-rw-r--r-- | Assets/Scripts/Common/MaterialCache.cs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/Assets/Scripts/Common/MaterialCache.cs b/Assets/Scripts/Common/MaterialCache.cs new file mode 100644 index 0000000..8d8ed93 --- /dev/null +++ b/Assets/Scripts/Common/MaterialCache.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using System.Linq; +using System; +using UnityEngine; +using System.Text; +using UnityEngine.UI; + +namespace Coffee.UIEffects +{ + public class MaterialCache + { + static Dictionary<Hash128, MaterialEntry> materialMap = new Dictionary<Hash128, MaterialEntry>(); + + private class MaterialEntry + { + public Material material; + public int referenceCount; + + public void Release() + { + if (material) + { + UnityEngine.Object.DestroyImmediate(material, false); + } + + material = null; + } + } + +#if UNITY_EDITOR + [UnityEditor.InitializeOnLoadMethod] + private static void ClearCache() + { + foreach (var entry in materialMap.Values) + { + entry.Release(); + } + + materialMap.Clear(); + } +#endif + + public static Material Register(Material baseMaterial, Hash128 hash, + System.Action<Material, Graphic> onModifyMaterial, Graphic graphic) + { + if (!hash.isValid) return null; + + MaterialEntry entry; + if (!materialMap.TryGetValue(hash, out entry)) + { + entry = new MaterialEntry() + { + material = new Material(baseMaterial) + { + hideFlags = HideFlags.HideAndDontSave, + }, + }; + + onModifyMaterial(entry.material, graphic); + materialMap.Add(hash, entry); + } + + entry.referenceCount++; + return entry.material; + } + + public static void Unregister(Hash128 hash) + { + MaterialEntry entry; + if (!hash.isValid || !materialMap.TryGetValue(hash, out entry)) return; + if (--entry.referenceCount > 0) return; + + entry.Release(); + materialMap.Remove(hash); + } + } +} |