unity3d 不同 缓存池_unity3d清理缓存 - CSDN
  • unity缓存池 基础篇

    千次阅读 2017-03-10 16:30:47
    缓存池 顾名思义 就是为了缓存而存在 主要优点:可以使游戏运行的更加流畅 主要缺点:占用一部分内存  虽然有 优缺点 但是在很多游戏制作中 我们还是很喜欢使用缓存池 unity 有个插件Poolmanager 还可以 挺好使的。...

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

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

    2019-04-12 17:03:55
    unity在创建物体后(申请内存),删除,内存中没有立刻释放,只是将引用取消掉. 缓存池: 优点:减少内存消耗,优化运行时效率,防止内存泄漏. 需要存放不同类型的游戏对象(GameObject) 使用字典来创建缓存池Dictionary<...

    unity在创建物体后(申请内存),删除,内存中没有立刻释放,只是将引用取消掉.

    缓存池:

    优点:减少内存消耗,优化运行时效率,防止内存泄漏.
    需要存放不同类型的游戏对象(GameObject)

    使用字典来创建缓存池Dictionary<key,List<GameObject>>

    缓存池创建:
    缓存池判断游戏物体是什么类型使用枚举

    public enum gameObjType
        {
            Bullet0,
            Bullet1,
        }
    

    缓存池只有一个,使用单例模式(静态类还可以new,使用单例模式就不能new了)进行创建

    //单例
        private static GamePool instance;
        public static GamePool Instance
        {
            get
            {
                return instance;
            }
        }
        private void Awake()
        {
            if (instance == null)
            {
                instance = this;
            }
        }
    
        static Dictionary<gameObjType, List<GameObject>> dic =
            new Dictionary<gameObjType, List<GameObject>>();
    
    

    1.判断字典中是否有要创建的游戏物体类型
    2.有此类型,遍历Value(List)中,有没有可以使用的GameObject,有的话返回它,没有的话,创建一个实例并在List中添加它,返回此实例.
    3.没有类型创建一个Key-Value对,新建一个List,新建一个目标类型游戏物体的实例,将此实例加入List,将List加入字典,返回此实例

    public GameObject CreateGameObj(gameObjType type)
        {
            Object go;//设为成员变量
            GameObject finalGo;
            go = Resources.Load("Bullet" + (int)type);
            if (dic.ContainsKey(type))//字典中存在type的情况
            {
                foreach (var item in dic[type])
                {
                    if (item.activeSelf == false)
                    {
                        return item;
                    }
                }
                //遍历List后没有可以用的GameObject情况
                finalGo = Instantiate(go) as GameObject;
                dic[type].Add(finalGo);
                return finalGo;
            }
            List<GameObject> temp = new List<GameObject>();
            finalGo = Instantiate(go) as GameObject;
            temp.Add(finalGo);
            dic.Add(type, temp);
            return finalGo;
        }

    更多unity2018的功能介绍请到paws3d爪爪学院查找。链接https://www.paws3d.com/,也可以加入unity学习讨论群935714213

    近期更有资深开发人士直播分享unity开发经验,详情请进入官网或加入QQ群了解

    展开全文
  • Unity3d 缓存池

    千次阅读 2014-07-11 14:51:27
    https://github.com/TarasOsiris/unity3d-prefab-pool
    展开全文
  • 其实一直很想写博客,但总是以为自己没有时间,今天和女友在学校图书馆看书,无意看到一...由于最近在摸索Unity3D的游戏开发,在学习制作一款FPS射击游戏时,接触到了缓存池(也称对象池)的使用,今天就把自己的所...

          其实一直很想写博客,但总是以为自己没有时间,今天和女友在学校图书馆看书,无意看到一个技术大牛作的序,从大学开始坚持写技术博客,把自己的所想所获记录下来,现在觉得确实是一种自我提高的有效方式,所以今天终于痛下决心,刚从健身房回到宿舍,便静下心来思忖自己的第一篇博客。由于最近在摸索Unity3D的游戏开发,在学习制作一款FPS射击游戏时,接触到了缓存池(也称对象池)的使用,今天就把自己的所想所获与大家分享。

          至于为什么会有缓存池这种东西存在,自然是以节省内存开销的目的。说通俗点,缓存池技术一般应用于实例化物体的过程中,Unity一般实例化物体会使用Instantiate()函数,销毁游戏物体一般使用Destroy()函数,频繁使用这两个函数会造成较大的内存占用,这时有一种技术,假设有一个水池,里边提前存放好游戏要用到的物体,当游戏不需要时,这些物体隐藏在水池里,当游戏需要时,这些物体就显示出来,这就是缓存池技术。

          Asset Store中提供了多种缓存池插件,个人用到的时Pool Boss,感觉还是比较好用的。当然Pool Boss集成在Core GameKit插件中,售价是25$,作为一个学生党仍然是感觉比较贵的,因此想办法单独下载了Pool Boss来使用,个人使用的版本是1.1.4,当然各位大佬完全可以选择Asset Store提供的插件,本人也很想知道那个版本有什么强大的功能。

            在我所学习制作的FPS射击游戏中,在当主角枪支发射的射线与敌人挂载的碰撞体发生接触,触发粒子特效时,这里用到了缓存池技术。将Pool Boss包导入,把PoolBoss预制体拖曳到Hierarchy层级面板,这样在Inspector视图里可以看到其所搭载的插件,把需要缓存的粒子预制体拖入黄色方框,其中Preload Qty决定了缓存的粒子数目,Allow Instantiate More也可以勾选,表示需要缓存的最大粒子数目,这个地方可以自己设置。这样在程序运行时可以实时监测粒子的产生和回收数目。



            相关代码如下:

           (1)把Instantiate()函数替换成:

                          DarkTonic.PoolBoss.PossBoss.Spawn("FX",my_transform.position,my_transform.rotation,null);

          (2) 把Destroy()函数替换成:

                    DarkTonic.PoolBoss.PoolBoss.Despawn(this.transform);

            另外不足:

             自己在对粒子和子弹这类物体进行测试,效果良好,但是在敌人的产生测试中,效果不理想,缓存池没有进行有效回收,暂时还不知道主要原因是什么;还有一种动态加载的技术,本人还没有深入研究。

              自己的第一篇技术博客就这样诞生了,感谢女友激发的灵感,立个flag:争取每两天更新一下,一段时间后看看自己的成长。当然其中自然有很多不足之处,还请各位大牛批评指正,小生一定虚心接受教诲。



          

    展开全文
  • Unity3D 内存优化(一)对象

    千次阅读 2016-04-27 20:53:38
    关于U3D内存优化,一直是游戏开发者头疼的事情,由于在项目中我们会频繁地创建和...设想一下,我们是否能做一个池子,将一些常用的对象在创建之后放入中,每次使用都直接从池子中查找获取,这样在提高对象利用率降低
  • Unity3D PoolManager缓冲插件

    千次阅读 2016-03-23 09:29:18
    我用的PoolManager版本是5.5.2的,导入的包总共有三个文件夹:Editor,Plugins,PoolManagerExampleFiles 1、Editor这个文件夹里面的东西,顾名思义,就是写关于编辑器的东西,从而使用于可以很方便的为对象添加...
  • 关于缓存池的概念这里不多赘述,不懂的请自行百度(????) 先说下我的思路,主要分3步(1:预加载,2:拿来用,3:回收不用的) 一 预加载: 就是根据自己的情况预估一下要使用的对象的大致个数,先预加载一些; 二 拿来用: ...
  • 于是试着写个缓存池来管理。 有个叫PoolManager的工具类插件可以很方便的实现,可以看这里的介绍Unity3D研究院之初探PoolManager插件。 但是其实对象池就是预先创建一点对象,当我们需要用的时候,去拿就行了。如果...
  • 简单实现缓存池

    2020-03-26 22:07:27
    学习笔记 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pool2 : MonoBehaviour { public static Pool2 instance;...private GameObject m_FatherObject;...
  • Unity简单对象缓冲技术

    千次阅读 2018-10-26 23:19:51
    一、建立对象缓冲脚本 /*** * * Title: * 预加载与对象缓冲技术 * * 对象缓冲管理器 * * Description: * 基本原理: * 通过管理思路,在游戏初始化的时候,生成一个初始的存放我们要复用的...
  • Unity3D中对象的使用

    千次阅读 2015-02-06 19:42:28
    Unity3D中对象的使用 原文地址:点击 翻译:claudio  The script is really simple but it has helped the performance in my iOS game tremendously by limiting the number of ...
  • Unity中使用的几种缓存方式

    千次阅读 2018-08-14 21:25:37
    一般性我们用得多的也就是各种处理和缓存字典。 我自己总结在Unity里用到缓存的地方: Class pool:网络PB类等 List pool:各种中间列表,用完即删的List Unity game object pool:缓存各种游戏中的Object、...
  • Unity】构建自己的GameObject缓存池

    千次阅读 2016-12-29 21:31:47
    using Game.Manager.Base; using System.Collections; using System.Collections.Generic; using UnityEngine;namespace Game.Common { public class PoolManager : BaseManager { priv
  • 知识点 ...缓存对象在层级窗口的结构 池子容器类—PoolData.cs /// <summary> /// 池子数据 /// </summary> public class PoolData { //池子中存储对象的父对象,当对用不使用时 ...
  • Unity游戏框架学习笔记——02缓存池 缓存池 缓存池,一般也称是缓冲池、对象池等等,顾名思义是一个用于存放对象的池子。 解决的是重复生成和销毁某一类对象,导致频繁GC(Garbage Collection)以至于游戏过程中卡顿...
  • Unity3D研究院之利用缓存池解决Instantiate慢的问题(七十三)  雨松MOMO 【Unity3D研究院之游戏开发】 围观8072次 20条评论 编辑日期:2014-07-18 字体:大 中 小 Unity3D做项目有三个...
1 2 3 4 5 ... 20
收藏数 1,140
精华内容 456
关键字:

unity3d 不同 缓存池