ResourceManager
- 以双向链表为基础的资源池
- 基础资源同步加载
- 基本资源卸载
- 基础资源异步加载
- 清空缓存
- 预加载
- 为ObjectManager提供的同步异步资源加载
双向链表
using System.Collections.Generic;
/*使用双向链表的原因 : 资源的使用频率,如果资源频繁使用,希望其处于最顶端.
* 不使用的慢慢放在底端去,清理缓存的时候从底端开始清理*/
public class ResourceManager : Singleton<ResourceManager>
{
}
/// <summary>
/// 双向链表的结构节点
/// </summary>
/// <typeparam name="T"></typeparam>
public class DoubleLinkedListNode<T> where T : class
{
/// <summary>
/// 前一个节点
/// </summary>
public DoubleLinkedListNode<T> prev = null;
/// <summary>
/// 后一个节点
/// </summary>
public DoubleLinkedListNode<T> next = null;
/// <summary>
/// 当前节点
/// </summary>
public T t = null;
}
/// <summary>
/// 双向链表结构
/// </summary>
/// <typeparam name="T"></typeparam>
public class DoubleLinkedList<T> where T : class, new()
{
/// <summary>
/// 表头
/// </summary>
public DoubleLinkedListNode<T> Head = null;
/// <summary>
/// 表尾
/// </summary>
public DoubleLinkedListNode<T> Tail = null;
/// <summary>
/// 双向链表结构类对象池
/// </summary>
protected ClassObjectPool<DoubleLinkedListNode<T>> m_DoubleLinkedNodePool = ObjectManager.Instance.GetOrCreateClassPool<DoubleLinkedListNode<T>>(500);
/// <summary>
/// 个数
/// </summary>
protected int m_Count = 0;
public int Count { get { return m_Count; } }
/// <summary>
/// 添加一个节点到头部
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public DoubleLinkedListNode<T> AddToHeader(T t)
{
DoubleLinkedListNode<T> pList = m_DoubleLinkedNodePool.Spawn(true);
pList.prev = null;
pList.next = null;
pList.t = t;
return AddToHeader(pList);
}
/// <summary>
/// 添加一个节点到头部
/// </summary>
/// <param name="pNode"></param>
/// <returns></returns>
public DoubleLinkedListNode<T> AddToHeader(DoubleLinkedListNode<T> pNode)
{
if (pNode == null)
{
return null;
}
pNode.prev = null;
if (Head == null)
{
Head = Tail = pNode;
}
else
{
pNode.next = Head;
Head.prev = pNode;
Head = pNode;
}
m_Count++;
return Head;
}
/// <summary>
/// 添加节点到尾部
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public DoubleLinkedListNode<T> AddToTail(T t)
{
DoubleLinkedListNode<T> pList = m_DoubleLinkedNodePool.Spawn(true);
pList.prev = null;
pList.next = null;
pList.t = t;
return AddToTail(pList);
}
/// <summary>
/// 添加节点到尾部
/// </summary>
/// <param name="pNode"></param>
/// <returns></returns>
public DoubleLinkedListNode<T> AddToTail(DoubleLinkedListNode<T> pNode)
{
if (pNode == null)
{
return null;
}
pNode.next = null;
if (Tail == null)
{
Head = Tail = pNode;
}
else
{
pNode.prev = Tail;
Tail.next = pNode;
Tail = pNode;
}
m_Count++;
return Tail;
}
/// <summary>
/// 移除某个节点
/// </summary>
/// <param name="pNode"></param>
public void RemoveNode(DoubleLinkedListNode<T> pNode)
{
if (pNode == null)
{
return;
}
if (pNode == Head)
{
Head = pNode.next;
}
if (pNode == Tail)
{
Tail = pNode.prev;
}
if (pNode.prev != null)
{
pNode.prev.next = pNode.next;
}
if (pNode.next != null)
{
pNode.next.prev = pNode.prev;
}
pNode.next = pNode.prev = null;
pNode.t = null;
m_DoubleLinkedNodePool.Recycle(pNode);
m_Count--;
}
/// <summary>
/// 移动到头部
/// </summary>
/// <param name="pNode"></param>
public void MoveToHead(DoubleLinkedListNode<T> pNode)
{
if (pNode == null || pNode == Head)
{
return;
}
if (pNode.next == null && pNode.prev == null)
{
return;
}
if (pNode == Tail)
{
Tail = pNode.prev;
}
if (pNode.prev != null)
{
pNode.prev.next = pNode.next;
}
if (pNode.next != null)
{
pNode.next.prev = pNode.prev;
}
pNode.prev = null;
pNode.next = Head;
Head.prev = pNode;
Head = pNode;
if (Tail == null)
{
Tail = Head;
}
}
}
/// <summary>
/// 对其简单的封装(一般包括插入,查找,获取表头,获取表尾,清除,移除,获取长度等):
/// </summary>
/// <typeparam name="T"></typeparam>
public class CMapList<T> where T : class, new()
{
DoubleLinkedList<T> m_DLink = new DoubleLinkedList<T>();
Dictionary<T, DoubleLinkedListNode<T>> m_FindMapDict = new Dictionary<T, DoubleLinkedListNode<T>>();
/// <summary>
/// 析构函数
/// </summary>
~CMapList()
{
Clear();
}
/// <summary>
/// 清除列表
/// </summary>
public void Clear()
{
while (m_DLink.Tail != null)
{
Remove(m_DLink.Tail.t);
}
}
/// <summary>
/// 插入一个节点到表头
/// </summary>
/// <param name="t"></param>
public void InsertToHead(T t)
{
DoubleLinkedListNode<T> node = null;
if (m_FindMapDict.TryGetValue(t, out node) && node != null)
{
m_DLink.AddToHeader(node);
return;
}
m_DLink.AddToHeader(t);
m_FindMapDict.Add(t, m_DLink.Head);
}
/// <summary>
/// 从表尾弹出一个节点
/// </summary>
public void Pop()
{
if (m_DLink.Tail != null)
{
Remove(m_DLink.Tail.t);
}
}
/// <summary>
/// 删除某个节点
/// </summary>
/// <param name="t"></param>
public void Remove(T t)
{
DoubleLinkedListNode<T> node = null;
if (!m_FindMapDict.TryGetValue(t, out node) || node == null)
{
return;
}
m_DLink.RemoveNode(node);
m_FindMapDict.Remove(t);
}
/// <summary>
/// 获取到尾部节点
/// </summary>
public T Back()
{
return m_DLink.Tail == null ? null : m_DLink.Tail.t;
}
/// <summary>
/// 返回节点个数
/// </summary>
/// <returns></returns>
public int Size()
{
return m_FindMapDict.Count;
}
/// <summary>
/// 查找是否存在该节点
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public bool Find(T t)
{
DoubleLinkedListNode<T> node = null;
if (!m_FindMapDict.TryGetValue(t, out node) || node == null)
{
return false;
}
return true;
}
/// <summary>
/// 刷新某个节点,把节点移动到头部
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public bool Refresh(T t)
{
DoubleLinkedListNode<T> node = null;
if (!m_FindMapDict.TryGetValue(t, out node) || node == null)
{
return false;
}
m_DLink.RemoveNode(node);
return true;
}
}
end