C# ListPool 缓存数据结构
标签: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
评论