Unity 对象池的使用
在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象。出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行。好吧,对于作为程序员的我们只能从第一个原因着手了,那就开始对着Profiler看性能开销,接下来就开始做各种内存,特效,代码上的优化了。对于这种问题,有经验的开发者在一开始就会做一个规范的设计,就我们的项目而言,设计时包含了角色池,怪物池,特效池,经验池,伤害池......所谓的对象池就是尽可能的复用内存中已经驻留的资源来减少频繁的IO耗时操作。使用对象池可以很好的解决内存上的压力,但是我们自己要维护好池中对象的状态。就粒子特效而言,当粒子特效释放后我们要对它Reset到初始状态,这样才能保证每次释放出的特效播放是正常的。好了,废话不多说了,开始一个简单的小例子,就拿我在项目中做的伤害和经验飘字为例。说到这个伤害和经验飘字,尤其是在MMO或者ARPG游戏中太常见了,进入自动战斗后,服务器会频繁的告诉客户端打怪耗了多少血获得了多少经验所以客户端要做的表现是很频繁的。我们不可能根据收到服务器的消息立刻去实例和销毁对应的飘字吧?这样还有一个问题,由于网络消息太快了,客户端不做处理的话一坨就叠加到一块了,,,我们自己都看不先去何况玩家呢?对于这个处理上,我选择使用一个队列,将服务器下发的消息分类入队,开一个协程去处理队列的信息同时控制好处理间隔时间,实例化的飘字预制放到经验池中,复用池中空闲的对象。简单的经验池,开始撸代码。
1,建一个简单的界面

2,我们先创建一个对象池

创建简单吧,接下来取到这个池的对象。
ExpPool = PoolManager.Pools["ExpPool"];
向池子中添加我们要复用的对象,例如粒子,模型,音频,,,等等。怎么添加呢?
ExpPool = PoolManager.Pools["ExpPool"];//获取对象池
if (!ExpPool._perPrefabPoolOptions.Contains(prefabPool))
{
prefabPool = new PrefabPool(Resources.Load<Transform>("LabExp"));//加载本地预制
//默认初始化一个Prefab
prefabPool.preloadAmount = 1;
//开启限制
prefabPool.limitInstances = true;
//关闭无限取Prefab
prefabPool.limitFIFO = false;
//限制池子里最大的Prefab数量
prefabPool.limitAmount = 10;
//开启自动清理池子
prefabPool.cullDespawned = true;
//最终保留
prefabPool.cullAbove = 10;
//多久清理一次
prefabPool.cullDelay = 5;
//每次清理几个
prefabPool.cullMaxPerPass = 5;
//初始化内存池
ExpPool._perPrefabPoolOptions.Add(prefabPool);//添加到池中
ExpPool.CreatePrefabPool(ExpPool._perPrefabPoolOptions[ExpPool.Count]);
}
else
{
Debug.Log("Already in prefabPool!");
}
3,添加完成了,那么接下来该去对象池中取对象了。
Transform labExp = ExpPool.Spawn("LabExp");
此处LabExp是加入到对象池的对象名称,也就是我本地经验飘字预制的名称。
4,最后一步对象状态初始化。
IEnumerator ResetPrefab(Transform obj)
{
yield return new WaitForSeconds(2f);
obj.GetComponent<TweenPosition>().ResetToBeginning();
obj.GetComponent<TweenScale>().ResetToBeginning();
obj.GetComponent<TweenAlpha>().ResetToBeginning();
ExpPool.Despawn(obj);
}
将使用过后的对象还原到开始状态,好了,一个简单的对象池可以使用了!
对了还有重要的一步:记得给对象池的父节点加上一个Panel,这样不会影响的其他界面组建的重绘。

PS:如果本文写的有不正确的地方记得@我,共同学习!
工程地址:https://github.com/wuzhangwuzhang/ExpPoolManager.git
Unity 对象池的使用的更多相关文章
- Unity 对象池 生产 保存
Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能. 主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示.如果不存在则创造一个新的. 当销毁时,调用协程延时隐藏物 ...
- Unity——对象池管理
Unity对象池管理 一.Demo展示 二.逻辑 在游戏中会出现大量重复的物体需要频繁的创建和销毁:比如子弹,敌人,成就列表的格子等: 频繁的创建删除物体会造成很大的开销,像这种大量创建重复且非持续性 ...
- Unity ----- 对象池GameObjectPool
孙广东 2014.6.28 非常早之前看到的外国文章,认为不错,分享一下. 对象池在AssetStore中也是有非常多插件的,可是有些重了.自己写一个轻量的岂不是非常好. 当你须要创建大量某种类型对象 ...
- Unity对象池的实现
对象池是一个单例类: using System.Collections; using System.Collections.Generic; using UnityEngine; public cla ...
- 游戏设计模式——Unity对象池
对象池这个名字听起来很玄乎,其实就是将一系列需要反复创建和销毁的对象存储在一个看不到的地方,下次用同样的东西时往这里取,类似于一个存放备用物质的仓库. 它的好处就是避免了反复实例化个体的运算,能减少大 ...
- Unity对象池管理
链接: http://www.xuanyusong.com/archives/2925 http://www.xuanyusong.com/archives/2974 https://www.cnbl ...
- Unity中对象池的使用
unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在 ...
- Unity中的万能对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...
- Unity 游戏框架搭建 (十九) 简易对象池
在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...
随机推荐
- tomcat程序记录客户端真实IP
需求: 开发告知:让后端tomcat日志获取真实的IP,而不是nginx 服务器的IP tomcat前面是nginx做的反向代理,所以tomcat取到的是nginx的ip. 日志名称是localhos ...
- (三)一个工作任务引起的乱战——udp通信
先上代码.该代码是在问度娘的过程中搜到的,自己实验运行了下,可以使用(vs2010 net fram4.0).服务端代码: using System;using System.Collections ...
- C#--方法的参数类型
在C#中,方法的参数类型有四种: 值类型 引用类型 输出类型 数组型参数 值参数: 所谓值参数,就是利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并将此拷贝传递给该方法,这样做的结果就是被调用 ...
- php简单的爬虫
爬虫的原理是分析下载的页面,找出其中的连接,然后再下载这些链接,对链接再进行更深层次的递归,周而复始.在数据存储方面,先存储到redis里面,再有redis 写入到mysql,这样可以减轻mysql写 ...
- em与px的区别 [ 转 ]
其实,还是不大理解,为什么1em=16px:而且,还一般要在body里面,就写清楚Fone-size=62.5%,然后再让1em=10px进行使用:那么,为什么不直接在当时定义em的时候,就直接让它等 ...
- PHP程序员衰老后的下场
长期从事编程活动的程序员都期望在50多岁时能爬到一个足够高的职位,或者能顺利的退休. 但我在这里讨论的可能是一个你还没有想过的问题:如果到那时你失业了呢? 50多岁时你的职业仕途会成为一个问题.如果你 ...
- Scala学习文档-访问修饰符
在scala里,对保护成员的访问比Java严格.Scala中,保护成员只在定义了成员的类的子类中可以访问,而Java中,还允许在同一个包的其他类中访问. package p1 { class FCla ...
- Swift—计算属性-备
计算属性本身不存储数据,而是从其他存储属性中计算得到数据. 计算属性概念: 计算属性提供了一个getter(取值访问器)来获取值,以及一个可选的setter(设置访问器)来间接设置其他属性或变量的值. ...
- [HDU] 2063 过山车(二分图最大匹配)
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 女生为X集合,男生为Y集合,求二分图最大匹配数即可. #include<cstdio> ...
- LINUX小技巧,如何在指定目录下搜索到含特定关键字的文件。
先找出文件,然后将文件作为输入,找具体关键字 find /etc -name "*" | xargs grep "Hello"