当前位置:首页 > 开发 > 移动开发 > 正文

Unity对象池的实现

发表于: 2015-07-07   作者:brotherlamp   来源:转载   浏览次数:
摘要: 网上介绍对象池的文章有很多,但是总感觉代码不太清晰,并不适合新手学习 最近在一个工程里看到一段对象池的代码感觉不错,故分享一下 [code]phpcode: using UnityEngine; using System.Collections; using System.Collections.Generic; using System;   public class

网上介绍对象池的文章有很多,但是总感觉代码不太清晰,并不适合新手学习

最近在一个工程里看到一段对象池的代码感觉不错,故分享一下

[code]phpcode

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using System;

 

public class PoolManager : UnitySingleton<PoolManager> {

 

       public static Dictionary<Type, Stack<IPoolable>> ObjectPoolDic = new Dictionary<Type, Stack<IPoolable>>();

       public static Dictionary<Type, int> ObjectPoolSizeDic = new Dictionary<Type,int>();

      

       void Start () {

 

       }

      

       public void RegistPoolableType(Type type, int poolSize)

       {

              if (!ObjectPoolDic.ContainsKey(type))

              {

                     ObjectPoolDic[type] = new Stack<IPoolable>();

                     ObjectPoolSizeDic[type] = poolSize;

              }

       }

      

       public bool HasPoolObject(Type type)

       {

              return ObjectPoolDic.ContainsKey(type) && ObjectPoolDic[type].Count > 0;

       }

      

       public bool IsPoolFull(Type type)

       {

              if (!ObjectPoolDic.ContainsKey(type))

                     return true;

              else if (ObjectPoolDic[type].Count >= ObjectPoolSizeDic[type])

                     return true;

              return false;

       }

      

       public IPoolable TakePoolObject(Type type)

       {

              if (ObjectPoolDic.ContainsKey(type) && ObjectPoolDic[type].Count > 0)

              {

                     return ObjectPoolDic[type].Pop();

              }

              else

              {

                     return null;

              }

       }

      

       public bool PutPoolObject(Type type, IPoolable obj)

       {

              if (!ObjectPoolDic.ContainsKey(type) || ObjectPoolDic[type].Count >= ObjectPoolSizeDic[type])

              {

                     GameObject.Destroy((obj as MonoBehaviour).gameObject);

                     return false;

              }

              else

              {

                     (obj as MonoBehaviour).gameObject.SetActive(false);

                     //(obj as MonoBehaviour).transform.parent = GameManager.Instance.PoolRoot;

                     ObjectPoolDic[type].Push(obj);

                     return true;

              }

       }

}

首先继承自一个单例类,就可以用PoolManager.Instance来获取这个类的单例了

定义了两个字典,一个用来对应存储对应的对象类型的栈,一个用来记录实例化的最大个数来控制内存

用的时候Pop,用完了Push

可存储在对象池的对象必须实现IPoolable接口

[code]phpcode

using UnityEngine;

using System.Collections;

 

public interface IPoolable {

 

       void Destroy();

}

destroy里可以这样写

[code]phpcode

       if (!PoolManager.Instance.IsPoolFull(GetType()))

              {

                     PoolManager.Instance.PutPoolObject(GetType(), this);

              }

              else

              {

                     GameObject.Destroy(this.gameObject);

              }

 

兄弟连IT教育与全球移动游戏联盟(GMGC)共同设立中国首家基于高端游戏开发的兄弟连&GMGC手游学院!高薪就业,就学手游开发,详情咨询官网客服:http://game.lampbrother.net/

PHPLinuxHTML5UIAndroid等视频教程(课件+笔记+视频)!联系Q2430675018

参加活动领取兄弟连原创视频教程光盘合集:http://www.lampbrother.net/newcd.html

 

 

Unity对象池的实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
C# 对象池的实现 对象池服务可以减少从头创建每个对象的系统开销。在激活对象时,它从池中提取。在
Jakarta对象池 ☆ 为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的
问题描述:在实现对象池的时候都会面对一个回收的问题,大部分实现都是将回收的主动权交给了使用方
Jakarta对象池 ☆ 为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的
Jakarta对象池 ☆为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消
Jakarta对象池 ☆ 为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的
早在2008年三年就发布了一个对象池工具类,允许你在集合中放置对象,在需要时再用,众所周知Flex的
1、对象池技术并没有限制说只能创建一个对象,而且这种技术同样适用于创建固定数量的对象,然而,这
Jakarta对象池 ☆为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消
转自:http://www.cocoachina.com/bbs/read.php?tid-9883-fpage-7.html 弄了个CoverFlow玩…附简单代
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号