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时内部进行序列化和反序列化 ...
随机推荐
- 常用元素的属性/方法 attr / val / html /text
常用元素的属性/方法 得到一个元素的高度, $("#myid").height() 得到一个元素的位置, $("#myid").offset() 返回的是一个o ...
- css行高line-height的用法(转)
本文导读: “行高“指一行文子的高度,具体来说是指两行文子间基线间的距离.在CSS,line-height被用来控制行与行之间的垂直距离.line- height 属性会影响行框的布局.在应用到一个块 ...
- CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况
//CGRectInset 将原来的矩形放大或者缩小,正表示缩小,-表示放大. CGRect rect= CGRectMake(20, 50, 100, 80); CGRect rect1=CGRec ...
- statusBarOrientation设备状态
判断设备的状态 UIApplication* app = [UIApplication sharedApplication]; // 判断设备方向状态,做响应的操作 if(app.statusBa ...
- C/C++中的浮点数运算
代码: #include <iostream> #include <cstdio> #include <cfloat> using namespace std; i ...
- 同步关键字synchronized
同步关键字synchronized 同步关键字synchronized使用简洁,代码可维护性好.在JDK6中,性能也比早期的JDK有很大的改进.如果可以满足程序要求,应该首先考虑这种同步方式. 关键字 ...
- 在git bush中如何退出vim编辑器
写npm的pakege.json文件的files配置时,如果有不想包含的文件,那就要创建.npmignore文件排除,但windows系统又不允许创建以点开头命名的文件,咋办? 这时候就要用到linu ...
- js函数的各种写法与调用
以下是我见过的各种js函数的各种写法以及调用,虽然有些写法及其调用我不清楚其专业术语叫啥,但并不影响我写一个总结笔记. 我们刚开始接触js语音,经常看到的这种名叫“使用function关键字来定义函数 ...
- PclZip:强大的PHP压缩与解压缩zip类
PclZip简介PclZip是一个很强大的压缩与解压缩zip文件的PHP类,PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip.PKZIP):且能对此类类档案进行处理,包括产 ...
- discuz 使模板中的函数不解析 正常使用
<!--{if $_GET['zcdw']=="baxi"}--><!--{eval $duiwuxinxi = "巴西队";}-->& ...