unity 之 缓存池 基础篇

缓存池 顾名思义 就是为了缓存而存在  主要优点:可以使游戏运行的更加流畅  主要缺点:占用一部分内存 

虽然有 优缺点 但是在很多游戏制作中 我们还是很喜欢使用缓存池 unity 有个插件Poolmanager 还可以 挺好使的。但是代码量过于庞大。

所以自己依照这个原理做了一个简单的prefab缓存池。代码量比较少。

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
public enum PoolType{
	None,
	Skill,
	UI,
	Other
}

public class Pool{
	public PoolType Tp = PoolType.None;
	public double CurTime = 0;
	public string PoolName = ""; //缓存池的名字
	public List<GameObject> Spawnls = new List<GameObject>(); //显示列表
	public List<GameObject> DeSpawnls = new List<GameObject>(); //显示列表
	public GameObject Spawn(){ //从缓存中取
		if(DeSpawnls.Count > 0){
			GameObject o = DeSpawnls[0];
			Spawnls.Add(o);
			DeSpawnls.RemoveAt(0);
			return o;
		}else{
			return null;
		}
	}

	public void Despawn(GameObject obj){ //进入缓存(在改进入缓存的调用不要Destroy哦,一般用卸载来进行统一的Destroy)
		Spawnls.Remove(obj);
		DeSpawnls.Add(obj);
	}

	public GameObject CreatePrefab(GameObject o){ //创建
		GameObject obj = GameObject.Instantiate(o);
		obj.name = o.name;
		Spawnls.Add(obj);
		return obj;
	}

	public void CleanAll(){
		for(int i = 0; i<Spawnls.Count; i++){
			GameObject.Destroy(Spawnls[i]);
		}
		for(int i = 0; i<DeSpawnls.Count; i++){
			GameObject.Destroy(DeSpawnls[i]);
		}
		Spawnls.Clear();
		DeSpawnls.Clear();
	}
}

public class PoolManager{
	public static Dictionary<string,Pool> PoolDic = new Dictionary<string,Pool>(); //总缓存
	public static int CheckUnloadTime = 30;//最大未使用并要清理的时间间隔

	static public double getTimeMilliseconds(DateTime time){
		if(time == null){
			time = DateTime.Now;
		}
		return time.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds;
	}
	public static void UnLoadPool(string name){//卸载某个缓存池的所有引用
		Pool pool = null;
		if(PoolDic.TryGetValue(name,out pool)){
			pool.CleanAll();
		}
	}

	public static void CheckPool(){ //自动清理调用
		double curTime = getTimeMilliseconds(DateTime.Now);
		foreach(KeyValuePair<string,Pool> pool in PoolDic){
			if(curTime - pool.Value.CurTime > CheckUnloadTime * 1000){
				UnLoadPool(pool.Key);
			}
		}
	}

	static public GameObject GetPrefabFromCachePool(GameObject o,Transform parent,PoolType type){ //获取prefab的缓存
		Pool pool = null;
		GameObject newObj = null;
		if(o != null){
			string name = o.name;
			if(PoolDic.TryGetValue(name,out pool)){
				newObj = pool.Spawn();
				if(newObj == null){
					newObj = pool.CreatePrefab(o);
				}else{
					//成功
				}
			}else{
				pool = new Pool();
				pool.PoolName = name;
				pool.Tp = type;
				newObj = pool.CreatePrefab(o);
				PoolDic.Add(name,pool);
			}
			if(parent != null){
				newObj.transform.SetParent(parent);
			}
			pool.CurTime = getTimeMilliseconds(DateTime.Now);
		}else{
			Debug.LogError("o is null");
		}
		return newObj;
	}
		
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值