C# ListPool 缓存数据结构

2021-02-07 10:14

阅读:591

标签:static   sed   stp   item   format   HERE   tar   ring   stat   

可重复使用(缓存)结构

1.利用静态类&静态方法获取某个数据结构。

2.利用静态变量在所有类成员中公用的原理,达到使用时(分情况)获取,不使用时不释放而是缓存以便下次使用的目的。


适用环境

  1.该数据结构存储的数据为临时数据,短时间使用后会被释放。

  2.某一帧内多次重复使用同一数据结构。(例如for循环中,当然你用循环外临时变量也是ok的)

  3.某些特殊情况,比如多线程的频繁交互。

使用方式:

  1.通过静态方法获取数据结构

  2.用完还给静态方法(一定记住)


代码:

使用方式:
        private void Start() 
        {
            List list = ListPool.Pop();
               
           // 使用

            ListPool.Push(list);
        }        

 

技术图片技术图片
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

namespace Game
{
    public class CSObjectPoolwhere T : class, new()
    {
        private Stack m_ObjStack = new Stack();
        private Action m_OnPop;
        private Action m_OnPush;
        
        
        public CSObjectPool(Action onPop, Action onPush)
        {
            m_OnPop = onPop;
            m_OnPush = onPush;
        }
        
        
        /// 
        /// 取出
        /// 
        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;
        }
        
        /// 
        /// 放回
        /// 
        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);
        }
    }
}
View Code
技术图片技术图片
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Game
{
    public static class ListPool
    {
        private static CSObjectPool> m_Pools = new CSObjectPool>(null, x => x.Clear());

        /// 
        /// 取出
        /// 
        public static List Pop()
        {
            return m_Pools.Pop();
        }
        /// 
        /// 放回
        /// 
        public static void Push(List list)
        {
            m_Pools.Push(list);
        }
    }


    public static class HashSetPool
    {
        private static CSObjectPool> m_Pools = new CSObjectPool>(null, x => x.Clear());

        /// 
        /// 取出
        /// 
        public static HashSet Pop()
        {
            return m_Pools.Pop();
        }
        /// 
        /// 放回
        /// 
        public static void Push(HashSet hashSet)
        {
            m_Pools.Push(hashSet);
        }
    }

}
View Code

C# ListPool 缓存数据结构

标签:static   sed   stp   item   format   HERE   tar   ring   stat   

原文地址:https://www.cnblogs.com/jwv5/p/11387241.html


评论


亲,登录后才可以留言!