C# ListPool 缓存数据结构
Posted jwv5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# ListPool 缓存数据结构相关的知识,希望对你有一定的参考价值。
可重复使用(缓存)结构
1.利用静态类&静态方法获取某个数据结构。
2.利用静态变量在所有类成员中公用的原理,达到使用时(分情况)获取,不使用时不释放而是缓存以便下次使用的目的。
适用环境
1.该数据结构存储的数据为临时数据,短时间使用后会被释放。
2.某一帧内多次重复使用同一数据结构。(例如for循环中,当然你用循环外临时变量也是ok的)
3.某些特殊情况,比如多线程的频繁交互。
使用方式:
1.通过静态方法获取数据结构
2.用完还给静态方法(一定记住)
代码:
使用方式: private void Start() List<PaintToolbarItem> list = ListPool<PaintToolbarItem>.Pop(); // 使用 ListPool<PaintToolbarItem>.Push(list);
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; namespace Game public class CSObjectPool<T> where T : class, new() private Stack<T> m_ObjStack = new Stack<T>(); private Action<T> m_OnPop; private Action<T> m_OnPush; public CSObjectPool(Action<T> onPop, Action<T> onPush) m_OnPop = onPop; m_OnPush = onPush; /// <summary> /// 取出 /// </summary> public T Pop() T obj = null; if(m_ObjStack.Count == 0) obj = new T(); else obj = m_ObjStack.Pop(); if(obj != null && m_OnPop != null) m_OnPop(obj); return obj; /// <summary> /// 放回 /// </summary> public void Push(T obj) if(obj == null) return; if(m_ObjStack.Count > 0 && ReferenceEquals(m_ObjStack.Peek(), obj)) Debug.LogError(string.Format("CSObjectPool error. Trying to push object that is already in the pool, obj = 0", obj)); return; if(m_OnPush != null) m_OnPush(obj); m_ObjStack.Push(obj);
using UnityEngine; using System.Collections; using System.Collections.Generic; namespace Game public static class ListPool<T> private static CSObjectPool<List<T>> m_Pools = new CSObjectPool<List<T>>(null, x => x.Clear()); /// <summary> /// 取出 /// </summary> public static List<T> Pop() return m_Pools.Pop(); /// <summary> /// 放回 /// </summary> public static void Push(List<T> list) m_Pools.Push(list); public static class HashSetPool<T> private static CSObjectPool<HashSet<T>> m_Pools = new CSObjectPool<HashSet<T>>(null, x => x.Clear()); /// <summary> /// 取出 /// </summary> public static HashSet<T> Pop() return m_Pools.Pop(); /// <summary> /// 放回 /// </summary> public static void Push(HashSet<T> hashSet) m_Pools.Push(hashSet);
以上是关于C# ListPool 缓存数据结构的主要内容,如果未能解决你的问题,请参考以下文章