Unity中对象池的使用
unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存。
对象池使用的基本思路是:
将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用。恰当地使用对象池,可以在一定程度上减少频繁创建对象所造成的开销。
并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。
GameObjectPool.cs如下
using UnityEngine;
using System.Collections;
using System.Collections.Generic; public class GameObjectPool : MonoBehaviour {
//单例模式
private static GameObjectPool instance; public static GameObjectPool Instance
{
get { return GameObjectPool.instance; }
set { GameObjectPool.instance = value; }
} private static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList>{ };
// Use this for initialization
void Start ()
{
Instance = this;
}
public static Object Get(string prefabName, Vector3 position, Quaternion rotation)
{
string key = prefabName + "(Clone)";
Object o;
//池中存在,则从池中取出
if (pool.ContainsKey(key) && pool[key].Count>)
{
ArrayList list=pool[key];
o=list[] as Object;
list.Remove(o);
//重新初始化相关状态
(o as GameObject).SetActive(true);
(o as GameObject).transform.position = position;
(o as GameObject).transform.rotation = rotation;
}
//池中没有则实例化gameobejct
else
{
o = Instantiate(Resources.Load(prefabName),position,rotation);
}
return o;
} public static Object Return(GameObject o)
{
string key = o.name;
if (pool.ContainsKey(key))
{
ArrayList list=pool[key];
list.Add(o);
}
else
{
pool[key] = new ArrayList(){ o};
}
o.SetActive(false);
return o;
}
}
Unity中对象池的使用的更多相关文章
- Unity实现”对象池管理器“
前言:警告!这可能是坨屎,空闲时间写成,仅作娱乐 在Unity中生成或销毁一个物体会占用较大的资源,如果是制作FPS射击游戏,子弹生成更是雪上加霜.所以我自己写了一个PoolManager,不能和网上 ...
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
- Unity中的万能对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介 ...
- 对象池----unity中应用
对象池应用在unity中能减少资源消耗,节省内存空间具体原理不再赘述. 以下是他的操作步骤:(注意:对象池中应用到了栈或对队列!) 1).先建立一个(怪物)物体 mMonster; 2).再建立一 ...
- Unity编程标准导引-3.4 Unity中的对象池
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...
- GameObjectPool——Unity中的对象池
这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Co ...
- Unity 对象池 生产 保存
Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能. 主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示.如果不存在则创造一个新的. 当销毁时,调用协程延时隐藏物 ...
- Unity 游戏框架搭建 (十九) 简易对象池
在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...
- Unity 游戏框架搭建 (二十) 更安全的对象池
上篇文章介绍了,只需通过实现IObjectFactory接口和继承Pool类,就可以很方便地实现一个SimpleObjectPool.SimpleObjectPool可以满足大部分的对象池的需求.而笔 ...
随机推荐
- Bootstrap 3兼容IE8浏览器(转)
Bootstrap是一个响应式的布局,你可以在宽屏电脑.普通电脑,平板电脑,手机上都得到非常优秀的布局体验.这种响应式的布局正是通过CSS3的媒体查询(Media Query)功能实现的,根据不同的分 ...
- Oracle获取AWR和ASH
-- 找到指定的snap select snap_id, max(sample_time) from sys.wrh$_active_session_history group by snap_id ...
- MyEclipse Hibernate 学习总结
最近在学习Hibernate,先把学习的过程记录一下,方便自己以后复习. 1.使用工具 MyEclipse 10 2. 1)新建Java程序 2)右键程序,选择MyEclipse-> Add H ...
- android 工程出现感叹号错误
android 工程出现感叹号错误: 错误问题分析,曾经导入的jar已经不存在工程目录中,project从其他地方导入时.没有及时更新,比如说svn下载到.project的文件,或者是path的文件. ...
- SPOJ #4 Transform the Expression
Not hard to know it is simply transform from in-order to post-order.My first idea is to build a tree ...
- bzoj2338 数矩形
给出N(N≤1500)个点,求选四个点作为顶点组成矩形的最大面积,保证有解. 对每两个点连边,按边长排序,枚举等长且中点相同的边作为对角线组成矩形,计算面积取最大值. 时间复杂度O(n2logn) # ...
- 建立一个node.js服务器(使用express搭建第一个Web环境)
一.官网下载node.js 下载地址:https://nodejs.org/en/download/ 根据向导,下一步安装就可以了! 二.使用express搭建Web环境 express是一个开源的n ...
- can't run as root without the -u switch
[root@localhost ~]# /usr/local/memcache/bin/memcached can't run as root without the -u switch [root@ ...
- JSP里的c:url中的/代表站点根目录还是WEB根目录?(待解答)
<c:url/>使用格式: <c:url var="<string>" scope="<string>" value= ...
- 指定WebService访问的语言
场景: 在访问ERP发布的WebService时,由于其指定了访问语言,导致不指定访问语言时,会有部分数据丢失. 解决: 通过WSDL工具生成代理类后,再次对其中的GetWebRequest方法进行重 ...