From de6295476535d0f9d075b5b5e6f1592514fba229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Mon, 17 Nov 2025 16:55:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9widget?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/UI/Constant/UIMetadataFactory.cs | 72 ++++++++++++++++---- Runtime/UI/Constant/UIMetadataObject.cs | 23 +++++++ Runtime/UI/Constant/UIMetadataObject.cs.meta | 3 + Runtime/UI/Manager/UIModule.Open.cs | 2 +- Runtime/UI/Manager/UIModule.cs | 12 ++-- Runtime/UI/UIBase/UIBase.Widget.cs | 14 ++-- Runtime/UI/UIBase/UITabWindow.cs | 6 +- 7 files changed, 104 insertions(+), 28 deletions(-) create mode 100644 Runtime/UI/Constant/UIMetadataObject.cs create mode 100644 Runtime/UI/Constant/UIMetadataObject.cs.meta diff --git a/Runtime/UI/Constant/UIMetadataFactory.cs b/Runtime/UI/Constant/UIMetadataFactory.cs index 3c3f944..23c40e2 100644 --- a/Runtime/UI/Constant/UIMetadataFactory.cs +++ b/Runtime/UI/Constant/UIMetadataFactory.cs @@ -1,25 +1,27 @@ using System; using System.Collections.Generic; using AlicizaX; +using AlicizaX.ObjectPool; namespace AlicizaX.UI.Runtime { - internal static class MetaTypeCache where T : UIBase - { - public static readonly UIMetadata Metadata; - - static MetaTypeCache() - { - var type = typeof(T); - Metadata = UIMetadataFactory.GetMetadata(type.TypeHandle); - } - } - internal static class UIMetadataFactory { private static readonly Dictionary UIWindowMetadata = new(); - internal static UIMetadata GetMetadata(RuntimeTypeHandle handle) + private static readonly IObjectPool m_UIMetadataPool; + + static UIMetadataFactory() + { + m_UIMetadataPool = ModuleSystem.GetModule().CreateSingleSpawnObjectPool("UI Metadata Pool", 60, 16, 60f, 0); + } + + internal static UIMetadata GetWindowMetadata() + { + return GetWindowMetadata(typeof(T).TypeHandle); + } + + internal static UIMetadata GetWindowMetadata(RuntimeTypeHandle handle) { if (!UIWindowMetadata.TryGetValue(handle, out var meta)) { @@ -29,5 +31,51 @@ namespace AlicizaX.UI.Runtime return meta; } + + internal static UIMetadata GetWidgetMetadata() + { + return GetWidgetMetadata(typeof(T)); + } + + internal static UIMetadata GetWidgetMetadata(RuntimeTypeHandle handle) + { + return GetFromPool(Type.GetTypeFromHandle(handle)); + } + + internal static UIMetadata GetWidgetMetadata(Type type) + { + return GetFromPool(type); + } + + private static UIMetadata GetFromPool(Type type) + { + if (type == null) return null; + + + string typeHandleKey = type.FullName; + + + UIMetadataObject metadataObj = m_UIMetadataPool.Spawn(typeHandleKey); + + if (metadataObj != null && metadataObj.Target != null) + { + return (UIMetadata)metadataObj.Target; + } + + + UIMetadata newMetadata = new UIMetadata(type); + UIMetadataObject newMetadataObj = UIMetadataObject.Create(newMetadata, typeHandleKey); + + m_UIMetadataPool.Register(newMetadataObj, true); + + return newMetadata; + } + + + internal static void ReturnToPool(UIMetadata metadata) + { + if (metadata == null) return; + m_UIMetadataPool.Unspawn(metadata); + } } } diff --git a/Runtime/UI/Constant/UIMetadataObject.cs b/Runtime/UI/Constant/UIMetadataObject.cs new file mode 100644 index 0000000..98df9f5 --- /dev/null +++ b/Runtime/UI/Constant/UIMetadataObject.cs @@ -0,0 +1,23 @@ +using AlicizaX.ObjectPool; + +namespace AlicizaX.UI.Runtime +{ + internal class UIMetadataObject : ObjectBase + { + public static UIMetadataObject Create(UIMetadata target, string name) + { + UIMetadataObject obj = MemoryPool.Acquire(); + obj.Initialize(name, target); + return obj; + } + + + protected internal override void Release(bool isShutdown) + { + UIMetadata metadata = (UIMetadata)Target; + if (metadata != null) + { + } + } + } +} diff --git a/Runtime/UI/Constant/UIMetadataObject.cs.meta b/Runtime/UI/Constant/UIMetadataObject.cs.meta new file mode 100644 index 0000000..ebd1f08 --- /dev/null +++ b/Runtime/UI/Constant/UIMetadataObject.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2212a30398cd4ca28f31f575c65cedd0 +timeCreated: 1763367776 \ No newline at end of file diff --git a/Runtime/UI/Manager/UIModule.Open.cs b/Runtime/UI/Manager/UIModule.Open.cs index 283f956..72c7eac 100644 --- a/Runtime/UI/Manager/UIModule.Open.cs +++ b/Runtime/UI/Manager/UIModule.Open.cs @@ -27,7 +27,7 @@ namespace AlicizaX.UI.Runtime CreateMetaUI(metaInfo); await UIHolderFactory.CreateUIResourceAsync(metaInfo, UICacheLayer); FinalizeShow(metaInfo, userDatas); - await UpdateVisualState(metaInfo); + UpdateVisualState(metaInfo).Forget(); return metaInfo.View; } diff --git a/Runtime/UI/Manager/UIModule.cs b/Runtime/UI/Manager/UIModule.cs index e68b26e..96ce2cc 100644 --- a/Runtime/UI/Manager/UIModule.cs +++ b/Runtime/UI/Manager/UIModule.cs @@ -43,7 +43,7 @@ namespace AlicizaX.UI.Runtime { if (UIMetaRegistry.TryGet(type, out var metaRegistry)) { - UIMetadata metadata = UIMetadataFactory.GetMetadata(metaRegistry.RuntimeTypeHandle); + UIMetadata metadata = UIMetadataFactory.GetWindowMetadata(metaRegistry.RuntimeTypeHandle); return ShowUI(metadata, userDatas); } @@ -52,23 +52,23 @@ namespace AlicizaX.UI.Runtime public T ShowUISync(params object[] userDatas) where T : UIBase { - return (T)ShowUIImplSync(MetaTypeCache.Metadata, userDatas); + return (T)ShowUIImplSync(UIMetadataFactory.GetWindowMetadata(), userDatas); } public async UniTask ShowUI(params System.Object[] userDatas) where T : UIBase { - return (T)await ShowUIAsync(MetaTypeCache.Metadata, userDatas); + return (T)await ShowUIAsync(UIMetadataFactory.GetWindowMetadata(), userDatas); } public void CloseUI(bool force = false) where T : UIBase { - CloseUIImpl(MetaTypeCache.Metadata, force).Forget(); + CloseUIImpl(UIMetadataFactory.GetWindowMetadata(), force).Forget(); } public T GetUI() where T : UIBase { - return (T)GetUIImpl(MetaTypeCache.Metadata); + return (T)GetUIImpl(UIMetadataFactory.GetWindowMetadata()); } @@ -85,7 +85,7 @@ namespace AlicizaX.UI.Runtime public void CloseUI(RuntimeTypeHandle handle, bool force = false) { - var metadata = UIMetadataFactory.GetMetadata(handle); + var metadata = UIMetadataFactory.GetWindowMetadata(handle); if (metadata.State != UIState.Uninitialized && metadata.State != UIState.Destroying) { CloseUIImpl(metadata, force).Forget(); diff --git a/Runtime/UI/UIBase/UIBase.Widget.cs b/Runtime/UI/UIBase/UIBase.Widget.cs index 418260c..6e658e0 100644 --- a/Runtime/UI/UIBase/UIBase.Widget.cs +++ b/Runtime/UI/UIBase/UIBase.Widget.cs @@ -84,19 +84,19 @@ namespace AlicizaX.UI.Runtime protected async UniTask CreateWidgetAsync(string typeName, Transform parent, bool visible = true) { UIMetaRegistry.TryGet(typeName, out var metaRegistry); - UIMetadata metadata = UIMetadataFactory.GetMetadata(metaRegistry.RuntimeTypeHandle); + UIMetadata metadata = UIMetadataFactory.GetWidgetMetadata(metaRegistry.RuntimeTypeHandle); return await CreateWidgetUIAsync(metadata, parent, visible); } protected async UniTask CreateWidgetAsync(Transform parent, bool visible = true) where T : UIBase { - UIMetadata metadata = MetaTypeCache.Metadata; + UIMetadata metadata = UIMetadataFactory.GetWidgetMetadata(); return (T)await CreateWidgetUIAsync(metadata, parent, visible); } protected async UniTask CreateWidgetAsync(UIHolderObjectBase holder) where T : UIBase { - UIMetadata metadata = MetaTypeCache.Metadata; + UIMetadata metadata = UIMetadataFactory.GetWidgetMetadata(); metadata.CreateUI(); UIBase widget = (UIBase)metadata.View; widget.BindUIHolder(holder, this); @@ -112,19 +112,19 @@ namespace AlicizaX.UI.Runtime protected UIBase CreateWidgetSync(string typeName, Transform parent, bool visible = true) { UIMetaRegistry.TryGet(typeName, out var metaRegistry); - UIMetadata metadata = UIMetadataFactory.GetMetadata(metaRegistry.RuntimeTypeHandle); + UIMetadata metadata = UIMetadataFactory.GetWidgetMetadata(metaRegistry.RuntimeTypeHandle); return CreateWidgetUISync(metadata, parent, visible); } protected T CreateWidgetSync(Transform parent, bool visible = true) where T : UIBase { - UIMetadata metadata = MetaTypeCache.Metadata; + UIMetadata metadata = UIMetadataFactory.GetWidgetMetadata(); return (T)CreateWidgetUISync(metadata, parent, visible); } protected T CreateWidgetSync(UIHolderObjectBase holder) where T : UIBase { - UIMetadata metadata = MetaTypeCache.Metadata; + UIMetadata metadata = UIMetadataFactory.GetWidgetMetadata(); metadata.CreateUI(); UIBase widget = (UIBase)metadata.View; widget.BindUIHolder(holder, this); @@ -154,6 +154,7 @@ namespace AlicizaX.UI.Runtime { Log.Warning("Already has widget:{0}", meta.View); meta.Dispose(); + UIMetadataFactory.ReturnToPool(meta); return false; } @@ -166,6 +167,7 @@ namespace AlicizaX.UI.Runtime { await widget.InternalClose(); meta.Dispose(); + UIMetadataFactory.ReturnToPool(meta); } } } diff --git a/Runtime/UI/UIBase/UITabWindow.cs b/Runtime/UI/UIBase/UITabWindow.cs index ccff64d..6fab2df 100644 --- a/Runtime/UI/UIBase/UITabWindow.cs +++ b/Runtime/UI/UIBase/UITabWindow.cs @@ -55,7 +55,7 @@ namespace AlicizaX.UI.Runtime // 初始化方法(泛型版本) protected void InitTabVirtuallyView(Transform parent = null) where TTab : UIWidget { - var metadata = MetaTypeCache.Metadata; + var metadata = UIMetadataFactory.GetWindowMetadata(); CacheTabMetadata(metadata, parent); } @@ -64,7 +64,7 @@ namespace AlicizaX.UI.Runtime { if (UIMetaRegistry.TryGet(typeName, out var metaRegistry)) { - var metadata = UIMetadataFactory.GetMetadata(metaRegistry.RuntimeTypeHandle); + var metadata = UIMetadataFactory.GetWindowMetadata(metaRegistry.RuntimeTypeHandle); CacheTabMetadata(metadata, parent); } } @@ -102,7 +102,7 @@ namespace AlicizaX.UI.Runtime try { - var metadata = UIMetadataFactory.GetMetadata(typeHandle); + var metadata = UIMetadataFactory.GetWindowMetadata(typeHandle); var parent = _tabCache[typeHandle]; var widget = await CreateWidgetUIAsync(metadata, parent, false);