From aa1da4de290b8f8bf60fdc39293eb9cd5a9e3270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Tue, 1 Apr 2025 15:21:02 +0800 Subject: [PATCH] modify --- Runtime/RecyclerView/ObjectPool.meta | 8 -- .../ObjectPool/IMixedObjectFactory.cs | 11 -- .../ObjectPool/IMixedObjectFactory.cs.meta | 11 -- .../ObjectPool/IMixedObjectPool.cs | 8 -- .../ObjectPool/IMixedObjectPool.cs.meta | 11 -- .../RecyclerView/ObjectPool/IObjectFactory.cs | 28 ----- .../ObjectPool/IObjectFactory.cs.meta | 11 -- .../RecyclerView/ObjectPool/IObjectPool.cs | 23 ---- .../ObjectPool/IObjectPool.cs.meta | 11 -- .../RecyclerView/ObjectPool/IPooledObject.cs | 5 - .../ObjectPool/IPooledObject.cs.meta | 11 -- .../ObjectPool/MixedObjectPool.cs | 101 ---------------- .../ObjectPool/MixedObjectPool.cs.meta | 11 -- Runtime/RecyclerView/ObjectPool/ObjectPool.cs | 108 ------------------ .../ObjectPool/ObjectPool.cs.meta | 11 -- .../ObjectPool/UnityComponentFactory.cs | 36 ------ .../ObjectPool/UnityComponentFactory.cs.meta | 11 -- .../ObjectPool/UnityGameObjectFactory.cs | 35 ------ .../ObjectPool/UnityGameObjectFactory.cs.meta | 11 -- .../ObjectPool/UnityMixedComponentFactory.cs | 61 ---------- .../UnityMixedComponentFactory.cs.meta | 11 -- .../ObjectPool/UnityMixedGameObjectFactory.cs | 40 ------- .../UnityMixedGameObjectFactory.cs.meta | 11 -- Runtime/RecyclerView/RecyclerView.cs | 5 + Runtime/RecyclerView/ViewHolder/ViewHolder.cs | 1 + .../ViewHolder/ViewHolderObject.cs | 35 ++++++ .../ViewHolder/ViewHolderObject.cs.meta | 3 + .../ViewHolder/ViewHolderObjectPool.cs | 43 +++++++ .../ViewHolder/ViewHolderObjectPool.cs.meta | 3 + .../ViewProvider/MixedViewProvider.cs | 14 +-- .../ViewProvider/SimpleViewProvider.cs | 16 +-- .../RecyclerView/ViewProvider/ViewProvider.cs | 18 ++- 32 files changed, 120 insertions(+), 603 deletions(-) delete mode 100644 Runtime/RecyclerView/ObjectPool.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/IObjectFactory.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/IObjectFactory.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/IObjectPool.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/IObjectPool.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/IPooledObject.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/IPooledObject.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/ObjectPool.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/ObjectPool.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs.meta delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs delete mode 100644 Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs.meta create mode 100644 Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs create mode 100644 Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs.meta create mode 100644 Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs create mode 100644 Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs.meta diff --git a/Runtime/RecyclerView/ObjectPool.meta b/Runtime/RecyclerView/ObjectPool.meta deleted file mode 100644 index cc7f7db..0000000 --- a/Runtime/RecyclerView/ObjectPool.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: a22aa56c3da6d724e97aafd9f3e7ed67 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs b/Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs deleted file mode 100644 index 547a0a5..0000000 --- a/Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs +++ /dev/null @@ -1,11 +0,0 @@ - -public interface IMixedObjectFactory where T : class -{ - T Create(string typeName); - - void Destroy(string typeName, T obj); - - void Reset(string typeName, T obj); - - bool Validate(string typeName, T obj); -} diff --git a/Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs.meta b/Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs.meta deleted file mode 100644 index 9fcb864..0000000 --- a/Runtime/RecyclerView/ObjectPool/IMixedObjectFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 30f89ee61eb3f0949b5300bd9b7cc577 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs b/Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs deleted file mode 100644 index d30a4fb..0000000 --- a/Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -public interface IMixedObjectPool : IDisposable where T : class -{ - T Allocate(string typeName); - - void Free(string typeName, T obj); -} diff --git a/Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs.meta b/Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs.meta deleted file mode 100644 index 209e188..0000000 --- a/Runtime/RecyclerView/ObjectPool/IMixedObjectPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3f4c13a4827ebad4a9ff08e636fbc67e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/IObjectFactory.cs b/Runtime/RecyclerView/ObjectPool/IObjectFactory.cs deleted file mode 100644 index ab3d6b5..0000000 --- a/Runtime/RecyclerView/ObjectPool/IObjectFactory.cs +++ /dev/null @@ -1,28 +0,0 @@ - -public interface IObjectFactory where T : class -{ - /// - /// 创建对象 - /// - /// - T Create(); - - /// - /// 销毁对象 - /// - /// - void Destroy(T obj); - - /// - /// 重置对象 - /// - /// - void Reset(T obj); - - /// - /// 验证对象 - /// - /// - /// - bool Validate(T obj); -} diff --git a/Runtime/RecyclerView/ObjectPool/IObjectFactory.cs.meta b/Runtime/RecyclerView/ObjectPool/IObjectFactory.cs.meta deleted file mode 100644 index 0e5fc88..0000000 --- a/Runtime/RecyclerView/ObjectPool/IObjectFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 77a642084db01624c8e5876605195d49 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/IObjectPool.cs b/Runtime/RecyclerView/ObjectPool/IObjectPool.cs deleted file mode 100644 index af1f544..0000000 --- a/Runtime/RecyclerView/ObjectPool/IObjectPool.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -public interface IObjectPool : IDisposable -{ - /// - /// 从池子中分配一个可用对象,没有的话就创建一个 - /// - /// - object Allocate(); - - /// - /// 将对象回收到池子中去,如果池中的对象数量已经超过了 maxSize,则直接销毁该对象 - /// - /// - void Free(object obj); -} - -public interface IObjectPool : IObjectPool, IDisposable where T : class -{ - new T Allocate(); - - void Free(T obj); -} diff --git a/Runtime/RecyclerView/ObjectPool/IObjectPool.cs.meta b/Runtime/RecyclerView/ObjectPool/IObjectPool.cs.meta deleted file mode 100644 index 5debf3d..0000000 --- a/Runtime/RecyclerView/ObjectPool/IObjectPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd12164a5eea20e41bf7f3b7704f4b33 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/IPooledObject.cs b/Runtime/RecyclerView/ObjectPool/IPooledObject.cs deleted file mode 100644 index cfbfa17..0000000 --- a/Runtime/RecyclerView/ObjectPool/IPooledObject.cs +++ /dev/null @@ -1,5 +0,0 @@ - -public interface IPooledObject -{ - void Free(); -} diff --git a/Runtime/RecyclerView/ObjectPool/IPooledObject.cs.meta b/Runtime/RecyclerView/ObjectPool/IPooledObject.cs.meta deleted file mode 100644 index ee50c4b..0000000 --- a/Runtime/RecyclerView/ObjectPool/IPooledObject.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b174ccb64b3938c449d4a69a3262d8d5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs b/Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs deleted file mode 100644 index 60484e6..0000000 --- a/Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; - -public class MixedObjectPool : IMixedObjectPool where T : class -{ - private const int DEFAULT_MAX_SIZE_PER_TYPE = 10; - - private readonly ConcurrentDictionary> entries; - private readonly ConcurrentDictionary typeSize; - private readonly IMixedObjectFactory factory; - - private int defaultMaxSizePerType; - - public MixedObjectPool(IMixedObjectFactory factory) : this(factory, DEFAULT_MAX_SIZE_PER_TYPE) - { - } - - public MixedObjectPool(IMixedObjectFactory factory, int defaultMaxSizePerType) - { - this.factory = factory; - this.defaultMaxSizePerType = defaultMaxSizePerType; - - if (defaultMaxSizePerType <= 0) - { - throw new ArgumentException("The maxSize must be greater than 0."); - } - - entries = new ConcurrentDictionary>(); - typeSize = new ConcurrentDictionary(); - } - - public T Allocate(string typeName) - { - if (entries.TryGetValue(typeName, out List list) && list.Count > 0) - { - T obj = list[0]; - list.RemoveAt(0); - return obj; - } - return factory.Create(typeName); - } - - public void Free(string typeName, T obj) - { - if (obj == null) return; - - if (!factory.Validate(typeName, obj)) - { - factory.Destroy(typeName, obj); - return; - } - - int maxSize = GetMaxSize(typeName); - List list = entries.GetOrAdd(typeName, n => new List()); - if (list.Count >= maxSize) - { - factory.Destroy(typeName, obj); - return; - } - - factory.Reset(typeName, obj); - list.Add(obj); - } - - public int GetMaxSize(string typeName) - { - if (typeSize.TryGetValue(typeName, out int size)) - { - return size; - } - return defaultMaxSizePerType; - } - - public void SetMaxSize(string typeName, int value) - { - typeSize.AddOrUpdate(typeName, value, (key, oldValue) => value); - } - - protected virtual void Clear() - { - foreach (var kv in entries) - { - string typeName = kv.Key; - List list = kv.Value; - - if (list == null || list.Count <= 0) continue; - - list.ForEach(e => factory.Destroy(typeName, e)); - list.Clear(); - } - entries.Clear(); - typeSize.Clear(); - } - - public void Dispose() - { - Clear(); - GC.SuppressFinalize(this); - } -} diff --git a/Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs.meta b/Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs.meta deleted file mode 100644 index 5af2b10..0000000 --- a/Runtime/RecyclerView/ObjectPool/MixedObjectPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0a62e68f43eac4b419140191eb09ea56 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/ObjectPool.cs b/Runtime/RecyclerView/ObjectPool/ObjectPool.cs deleted file mode 100644 index 1476ef5..0000000 --- a/Runtime/RecyclerView/ObjectPool/ObjectPool.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Threading; - -public class ObjectPool : IObjectPool where T : class -{ - private int maxSize; - private int initialSize; - protected readonly T[] entries = null; - protected readonly IObjectFactory factory; - - public ObjectPool(IObjectFactory factory) : this(factory, Environment.ProcessorCount * 2) - { - } - - public ObjectPool(IObjectFactory factory, int maxSize) : this(factory, 0, maxSize) - { - } - - public ObjectPool(IObjectFactory factory, int initialSize, int maxSize) - { - this.factory = factory; - this.initialSize = initialSize; - this.maxSize = maxSize; - this.entries = new T[maxSize]; - - if (maxSize < initialSize) - { - throw new ArgumentException("The maxSize must be greater than or equal to the initialSize."); - } - - for (int i = 0; i < initialSize; i++) - { - entries[i] = factory.Create(); - } - } - - public int MaxSize => maxSize; - - public int InitialSize => initialSize; - - public virtual T Allocate() - { - for (var i = 0; i < entries.Length; i++) - { - T value = entries[i]; - if (value == null) continue; - - if (Interlocked.CompareExchange(ref entries[i], null, value) == value) - { - return value; - } - } - - return factory.Create(); - } - - public virtual void Free(T obj) - { - if (obj == null) return; - - if (!factory.Validate(obj)) - { - factory.Destroy(obj); - return; - } - - factory.Reset(obj); - - for (var i = 0; i < entries.Length; i++) - { - if (Interlocked.CompareExchange(ref entries[i], obj, null) == null) - { - return; - } - } - - factory.Destroy(obj); - } - - object IObjectPool.Allocate() - { - return Allocate(); - } - - public void Free(object obj) - { - Free((T)obj); - } - - protected virtual void Clear() - { - for (var i = 0; i < entries.Length; i++) - { - var value = Interlocked.Exchange(ref entries[i], null); - - if (value != null) - { - factory.Destroy(value); - } - } - } - - public void Dispose() - { - Clear(); - GC.SuppressFinalize(this); - } -} diff --git a/Runtime/RecyclerView/ObjectPool/ObjectPool.cs.meta b/Runtime/RecyclerView/ObjectPool/ObjectPool.cs.meta deleted file mode 100644 index 543d2f4..0000000 --- a/Runtime/RecyclerView/ObjectPool/ObjectPool.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 30999e5e03e2b434996100b09960468f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs b/Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs deleted file mode 100644 index c27b24c..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs +++ /dev/null @@ -1,36 +0,0 @@ -using UnityEngine; - -public class UnityComponentFactory : IObjectFactory where T : Component -{ - private T template; - private Transform parent; - - public UnityComponentFactory(T template, Transform parent) - { - this.template = template; - this.parent = parent; - } - - public T Create() - { - T obj = Object.Instantiate(template, parent); - return obj; - } - - public void Destroy(T obj) - { - Object.Destroy(obj.gameObject); - } - - public void Reset(T obj) - { - obj.gameObject.SetActive(false); - obj.gameObject.transform.position = Vector3.zero; - obj.gameObject.transform.rotation = Quaternion.identity; - } - - public bool Validate(T obj) - { - return true; - } -} diff --git a/Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs.meta b/Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs.meta deleted file mode 100644 index 956f9ab..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityComponentFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3e2e3a0444783a7469d494ad630dc705 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs b/Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs deleted file mode 100644 index 58f56d1..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs +++ /dev/null @@ -1,35 +0,0 @@ -using UnityEngine; - -public class UnityGameObjectFactory : IObjectFactory -{ - protected GameObject template; - protected Transform parent; - - public UnityGameObjectFactory(GameObject template, Transform parent) - { - this.template = template; - this.parent = parent; - } - - public virtual GameObject Create() - { - return Object.Instantiate(template, parent); - } - - public virtual void Reset(GameObject obj) - { - obj.SetActive(false); - obj.transform.position = Vector3.zero; - obj.transform.rotation = Quaternion.identity; - } - - public virtual void Destroy(GameObject obj) - { - Object.Destroy(obj); - } - - public virtual bool Validate(GameObject obj) - { - return true; - } -} diff --git a/Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs.meta b/Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs.meta deleted file mode 100644 index f77bddc..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityGameObjectFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7373bce96f2a515499c52b060ad9e01e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs b/Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs deleted file mode 100644 index 3b8d7b2..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class UnityMixedComponentFactory : IMixedObjectFactory where T : Component -{ - protected T template; - protected Transform parent; - protected List list; - - private Dictionary dict = new(); - - public UnityMixedComponentFactory(T template, Transform parent) - { - this.template = template; - this.parent = parent; - } - - public UnityMixedComponentFactory(List list, Transform parent) - { - this.list = list; - this.parent = parent; - - foreach (var data in list) - { - dict[data.name] = data; - } - } - - public UnityMixedComponentFactory(Dictionary dict, Transform parent) - { - this.dict = dict; - this.parent = parent; - } - - public T Create(string typeName) - { - T obj = Object.Instantiate(dict[typeName], parent); - obj.transform.position = Vector3.zero; - obj.transform.rotation = Quaternion.identity; - - return obj; - } - - public void Destroy(string typeName, T obj) - { - Object.Destroy(obj.gameObject); - } - - public void Reset(string typeName, T obj) - { - obj.gameObject.SetActive(false); - obj.transform.position = Vector3.zero; - obj.transform.rotation = Quaternion.identity; - } - - public bool Validate(string typeName, T obj) - { - return true; - } -} diff --git a/Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs.meta b/Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs.meta deleted file mode 100644 index 19b9f96..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityMixedComponentFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5c2d58d006be3fc458b8c6761d76bc88 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs b/Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs deleted file mode 100644 index 585ac75..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs +++ /dev/null @@ -1,40 +0,0 @@ -using UnityEngine; - -public class UnityMixedGameObjectFactory : IMixedObjectFactory -{ - protected GameObject template; - protected Transform parent; - - public UnityMixedGameObjectFactory(GameObject template, Transform parent) - { - this.template = template; - this.parent = parent; - } - - public GameObject Create(string typeName) - { - GameObject obj = Object.Instantiate(template, parent); - GameObject model = Object.Instantiate(Resources.Load("ObjectPools/" + typeName), obj.transform); - model.transform.position = Vector3.zero; - model.transform.rotation = Quaternion.identity; - - return obj; - } - - public void Destroy(string typeName, GameObject obj) - { - Object.Destroy(obj); - } - - public void Reset(string typeName, GameObject obj) - { - obj.SetActive(false); - obj.transform.position = Vector3.zero; - obj.transform.rotation = Quaternion.identity; - } - - public bool Validate(string typeName, GameObject obj) - { - return true; - } -} diff --git a/Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs.meta b/Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs.meta deleted file mode 100644 index 4f53e07..0000000 --- a/Runtime/RecyclerView/ObjectPool/UnityMixedGameObjectFactory.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 16c8995b85215c6458119d581eea60b0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Runtime/RecyclerView/RecyclerView.cs b/Runtime/RecyclerView/RecyclerView.cs index 451027e..ab3e128 100644 --- a/Runtime/RecyclerView/RecyclerView.cs +++ b/Runtime/RecyclerView/RecyclerView.cs @@ -236,6 +236,11 @@ namespace AlicizaX.UI.RecyclerView } } + private void OnDestroy() + { + viewProvider?.Dispose(); + } + public void Reset() { viewProvider?.Reset(); diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolder.cs b/Runtime/RecyclerView/ViewHolder/ViewHolder.cs index 392adb7..d6ae33f 100644 --- a/Runtime/RecyclerView/ViewHolder/ViewHolder.cs +++ b/Runtime/RecyclerView/ViewHolder/ViewHolder.cs @@ -45,5 +45,6 @@ namespace AlicizaX.UI.RecyclerView public virtual void BindChoiceState(bool state) { } + } } diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs b/Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs new file mode 100644 index 0000000..306274b --- /dev/null +++ b/Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs @@ -0,0 +1,35 @@ +using AlicizaX.ObjectPool; +using UnityEngine; + +namespace AlicizaX.UI.RecyclerView +{ + internal class ViewHolderObject : ObjectBase + { + public static ViewHolderObject Create(string location, UnityEngine.Object target) + { + ViewHolderObject item = MemoryPool.Acquire(); + item.Initialize(location, target); + return item; + } + + protected override void OnUnspawn() + { + base.OnUnspawn(); + (Target as ViewHolder).gameObject.SetActive(false); + } + + protected override void OnSpawn() + { + base.OnSpawn(); + (Target as ViewHolder).gameObject.SetActive(true); + } + + protected override void Release(bool isShutdown) + { + if (Target != null) + { + GameObject.Destroy((Target as ViewHolder).gameObject); + } + } + } +} diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs.meta b/Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs.meta new file mode 100644 index 0000000..6564880 --- /dev/null +++ b/Runtime/RecyclerView/ViewHolder/ViewHolderObject.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6a241cb39eb24df0ae5db5a7a764dd27 +timeCreated: 1743476681 \ No newline at end of file diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs b/Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs new file mode 100644 index 0000000..61765e2 --- /dev/null +++ b/Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs @@ -0,0 +1,43 @@ +using AlicizaX.ObjectPool; +using UnityEngine; + +namespace AlicizaX.UI.RecyclerView +{ + internal static class ViewHolderObjectPool + { + private static readonly IObjectPool _ObjectPool; + private const string OBJECTPOOLNAME = "ViewHolderObjectPool"; + + static ViewHolderObjectPool() + { + _ObjectPool = GameApp.ObjectPool.CreateSingleSpawnObjectPool(name: OBJECTPOOLNAME, autoReleaseInterval: 60, capacity: 60, expireTime: float.MaxValue, 0); + } + + public static ViewHolder Allocate(ViewHolder template, Transform parent) + { + ViewHolder viewHolder = null; + ViewHolderObject viewHolderObject = _ObjectPool.Spawn(template.name); + if (viewHolderObject != null) + { + viewHolder = (ViewHolder)viewHolderObject.Target; + } + else + { + viewHolder = UnityEngine.Object.Instantiate(template, parent); + _ObjectPool.Register(ViewHolderObject.Create(template.name, viewHolder), true); + } + + return viewHolder; + } + + public static void Free(ViewHolder viewHolder) + { + _ObjectPool.Unspawn(viewHolder); + } + + public static void Release(ViewHolder viewHolder) + { + _ObjectPool.ReleaseObject(viewHolder); + } + } +} diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs.meta b/Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs.meta new file mode 100644 index 0000000..e65a489 --- /dev/null +++ b/Runtime/RecyclerView/ViewHolder/ViewHolderObjectPool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cae2bcb0572045019267379f5dab4e23 +timeCreated: 1743486723 \ No newline at end of file diff --git a/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs b/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs index a4d64c4..2026a1e 100644 --- a/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs +++ b/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using AlicizaX.ObjectPool; using UnityEngine; namespace AlicizaX.UI.RecyclerView @@ -10,7 +11,6 @@ namespace AlicizaX.UI.RecyclerView [SerializeField] private ViewHolder chatLeftViewHolder; [SerializeField] private ViewHolder chatRightViewHolder; - private IMixedObjectPool objectPool; private Dictionary dict = new(); public MixedViewProvider(RecyclerView recyclerView, ViewHolder[] templates) : base(recyclerView, templates) @@ -19,9 +19,6 @@ namespace AlicizaX.UI.RecyclerView { dict[template.name] = template; } - - UnityMixedComponentFactory factory = new(dict, recyclerView.Content); - objectPool = new MixedObjectPool(factory); } public override ViewHolder GetTemplate(string viewName) @@ -30,6 +27,7 @@ namespace AlicizaX.UI.RecyclerView { throw new NullReferenceException("ViewProvider templates can not null or empty."); } + return dict[viewName]; } @@ -39,25 +37,23 @@ namespace AlicizaX.UI.RecyclerView { throw new NullReferenceException("ViewProvider templates can not null or empty."); } + return dict.Values.ToArray(); } public override ViewHolder Allocate(string viewName) { - var viewHolder = objectPool.Allocate(viewName); - viewHolder.gameObject.SetActive(true); - return viewHolder; + return ViewHolderObjectPool.Allocate(GetTemplate(viewName), recyclerView.Content); } public override void Free(string viewName, ViewHolder viewHolder) { - objectPool.Free(viewName, viewHolder); + ViewHolderObjectPool.Free(viewHolder); } public override void Reset() { Clear(); - objectPool.Dispose(); } } } diff --git a/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs b/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs index d17bc6d..c427781 100644 --- a/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs +++ b/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs @@ -1,15 +1,15 @@ using System; +using AlicizaX.ObjectPool; +using UnityEngine; namespace AlicizaX.UI.RecyclerView { public sealed class SimpleViewProvider : ViewProvider { - private readonly IObjectPool objectPool; public SimpleViewProvider(RecyclerView recyclerView, ViewHolder[] templates) : base(recyclerView, templates) { - UnityComponentFactory factory = new(GetTemplate(), recyclerView.Content); - objectPool = new ObjectPool(factory, 100); + } public override ViewHolder GetTemplate(string viewName = "") @@ -18,6 +18,7 @@ namespace AlicizaX.UI.RecyclerView { throw new NullReferenceException("ViewProvider templates can not null or empty."); } + return templates[0]; } @@ -27,25 +28,24 @@ namespace AlicizaX.UI.RecyclerView { throw new NullReferenceException("ViewProvider templates can not null or empty."); } + return templates; } public override ViewHolder Allocate(string viewName) { - var viewHolder = objectPool.Allocate(); - viewHolder.gameObject.SetActive(true); - return viewHolder; + return ViewHolderObjectPool.Allocate(GetTemplate(),recyclerView.Content); } public override void Free(string viewName, ViewHolder viewHolder) { - objectPool.Free(viewHolder); + ViewHolderObjectPool.Free(viewHolder); } public override void Reset() { Clear(); - objectPool.Dispose(); } + } } diff --git a/Runtime/RecyclerView/ViewProvider/ViewProvider.cs b/Runtime/RecyclerView/ViewProvider/ViewProvider.cs index 195b8e1..bbdaadb 100644 --- a/Runtime/RecyclerView/ViewProvider/ViewProvider.cs +++ b/Runtime/RecyclerView/ViewProvider/ViewProvider.cs @@ -1,4 +1,6 @@ +using System; using System.Collections.Generic; +using AlicizaX.UI.Runtime; using UnityEngine; namespace AlicizaX.UI.RecyclerView @@ -6,7 +8,7 @@ namespace AlicizaX.UI.RecyclerView /// /// 提供和管理 ViewHolder /// - public abstract class ViewProvider + public abstract class ViewProvider : IDisposable { private readonly List viewHolders = new(); @@ -83,6 +85,7 @@ namespace AlicizaX.UI.RecyclerView return viewHolder; } } + return null; } @@ -100,6 +103,7 @@ namespace AlicizaX.UI.RecyclerView return i; } } + return -1; } @@ -109,6 +113,7 @@ namespace AlicizaX.UI.RecyclerView { Free(viewHolder.Name, viewHolder); } + viewHolders.Clear(); } @@ -127,5 +132,16 @@ namespace AlicizaX.UI.RecyclerView { return Adapter == null ? 0 : Adapter.GetItemCount(); } + + public void Dispose() + { + foreach (var viewHolder in viewHolders) + { + Free(viewHolder.Name, viewHolder); + ViewHolderObjectPool.Release(viewHolder); + } + + viewHolders.Clear(); + } } }