在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象。出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行。好吧,对于作为程序员的我们只能从第一个原因着手了,那就开始对着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 对象池的使用的更多相关文章

  1. Unity 对象池 生产 保存

    Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能. 主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示.如果不存在则创造一个新的. 当销毁时,调用协程延时隐藏物 ...

  2. Unity——对象池管理

    Unity对象池管理 一.Demo展示 二.逻辑 在游戏中会出现大量重复的物体需要频繁的创建和销毁:比如子弹,敌人,成就列表的格子等: 频繁的创建删除物体会造成很大的开销,像这种大量创建重复且非持续性 ...

  3. Unity ----- 对象池GameObjectPool

    孙广东 2014.6.28 非常早之前看到的外国文章,认为不错,分享一下. 对象池在AssetStore中也是有非常多插件的,可是有些重了.自己写一个轻量的岂不是非常好. 当你须要创建大量某种类型对象 ...

  4. Unity对象池的实现

    对象池是一个单例类: using System.Collections; using System.Collections.Generic; using UnityEngine; public cla ...

  5. 游戏设计模式——Unity对象池

    对象池这个名字听起来很玄乎,其实就是将一系列需要反复创建和销毁的对象存储在一个看不到的地方,下次用同样的东西时往这里取,类似于一个存放备用物质的仓库. 它的好处就是避免了反复实例化个体的运算,能减少大 ...

  6. Unity对象池管理

    链接: http://www.xuanyusong.com/archives/2925 http://www.xuanyusong.com/archives/2974 https://www.cnbl ...

  7. Unity中对象池的使用

    unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在 ...

  8. Unity中的万能对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...

  9. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

随机推荐

  1. (七)《Java编程思想》——多态的缺陷

    1.不能“覆盖”私有方法 package chapter8; /** * 不能"覆盖"私有方法 */ public class PrivateOverride { private ...

  2. NPOI心得

    一个Excel文件表示为一个IWookbook,Sheet是ISheet,其它细分为IRow,ICell. 2003和2007版本为IWookbook接口的不同实现:HSSFWookbook和XSSF ...

  3. java 位运算权限管控(转载)

    这里笔者介绍一种很常用,也比较专业的权限控制思路.这里用java语言描述,其实都差不多的.要换成其他的语言主,自己转一下就可以了.为了方便起见,我们这里定义a^b为:a的b次方.这里,我们为每一个操作 ...

  4. vsftpd安装、多用户配置

    1.vsftpd安装 rpm -ivh vsftpd 2.2.2 11.el6_4.1.x86_x64.rpm 2.添加ftp用户 添加ftp用户组 groupadd ftpg 添加ftp用户 use ...

  5. iOS开发之17个常用代码整理

    http://www.cnblogs.com/ios8/p/ios-17-code.html

  6. mysql 5.6 参数详解

    系统变量提供的是各种与服务器配置和功能有关的信息.大部分的系统变量都可以在服务器启动时进行设置.在运行时,每一个系统变量都拥有一个全局值或会话值,或者同时拥有这两个值.许多系统变量都是动态的,也就是说 ...

  7. nodemon 或者 Supervisor 监控 Express4.x的代码改动

    Express 4.x 默认将启动模块分离到了./bin/www中,直接使用 supervisor/nodemon 无法正常监控应用,使得开发过程中的调试非常不方便.所以我们直接把./bin/www中 ...

  8. 3月25日html(六) Javascrip

                             第1部分 JavaScript简介 1.JavaScript它是个什么东西? 它是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 2.它与J ...

  9. jquery多级联动(ajax查数据库)

    /id 代表下级下拉框ID,cityCode代表的是父级菜单代码,所有级菜单在同一张表,后台在加载是把菜单已经加入到Map缓存中.... //id 代表下级下拉框ID,cityCode代表的是父级菜单 ...

  10. 微信分享jsdk接口

    HTML文件 <!DOCTYPE html><html><head> <meta charset="utf-8"> <titl ...