您的位置:首页 > 移动开发 > Unity3D

unity 之 缓存池 基础篇

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

虽然有 优缺点 但是在很多游戏制作中 我们还是很喜欢使用缓存池 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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息