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;
}
}
虽然有 优缺点 但是在很多游戏制作中 我们还是很喜欢使用缓存池 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;
}
}
相关文章推荐
- 【Unity学习笔记】——基础篇:Camera分屏
- Unity&Shader基础篇-可编程GPU图形绘制管线
- Unity 与 ARkit 开发-基础篇
- 【Unity学习笔记】——基础篇:UGUI基础Image Type
- Unity Editor 基础篇(四):Handles
- Unity&Shader基础篇-Cg语法
- 【游戏渲染】Unity&Shader基础篇-Cg语法,数据类型与关键字
- 【Unity学习笔记】——基础篇:渲染管线
- Unity&Shader基础篇-概述
- 【Unity学习笔记】——基础篇:遮挡剔除 @ InstantOC插件
- Unity Editor 基础篇(一):Build-In Attribute
- Unity&Shader基础篇-“Hello Cg”
- 【Unity学习笔记】——基础篇:多细节层次LOD技术
- [Unity XLua]热更新XLua入门(一)-基础篇
- Unity&Shader基础篇—轮廓增强
- 【小松教你手游开发】【游戏渲染】Unity&Shader基础篇-Cg语法,数据类型与关键字
- 【Unity学习笔记】——基础篇:小地图制作③
- [置顶] [Unity XLua]热更新XLua入门(一)-基础篇
- unity中的特效管理器(特效缓存池)
- Unity&Shader基础篇-常用函数的使用与案例