unity3D初识对象池技术

对象池概念:用来优化游戏,提升游戏性能,如飞机大战 ,当触及到大量的物体需要不断的重新的被创建的时候,这个时候就适合用到对象池。

下面我会写一个例子更详细的来说明下这个对象池的用法:

对象池主要有2个方法

1:从池里去找东西

2:往池里放东西

这里我是写了一个打砖块的例子,后续我会把整个游戏的代码分享出来,里面包含一个拿和一个放的方法。

using UnityEngine;

using System.Collections;

using System.Collections.Generic; //用字典必须加上这个

public class ObjectPool : MonoBehaviour

{

public static ObjectPool intance;  //单例模式

public static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList> { };  //字典保存我们要保存的对象

void Start()

{

intance = this;

}

//从对象池里拿到我们的对象

public Object Get(string prefabName, Vector3 position, Quaternion rotation)

{

string key = prefabName + "(Clone)";

Object o;

if (pool.ContainsKey(key) && pool[key].Count > 0) //判断这个池里有没有要拿的对象

{

ArrayList list = pool[key];

o = list[0] as Object;

list.RemoveAt(0);

//重新初始化相关状态

(o as GameObject).SetActive(true);

(o as GameObject).transform.position = position;

(o as GameObject).transform.rotation = rotation;

}

else

{

o = Instantiate(Resources.Load(prefabName), position, rotation); //如果池里没有对象了就实例化一个出来

}

// Object o = Instantiate(Resources.Load(prefabName), position, rotation);

//初似化池里面的数据

DelayDestroy dd = (o as GameObject).GetComponent<DelayDestroy>();

dd.Init();

return o;

}

//把对象放回对象池

public Object Return(GameObject o)

{

string key = o.name;

print("Return key" + key);

if (pool.ContainsKey(key)) //判断池里是否有我们要拿的对象

{

ArrayList list = pool[key];

list.Add(o);

}

else

{

pool[key] = new ArrayList() { o };

}

o.SetActive(false); //让对象隐藏

return o;

}

}

代码2://销毁对象的代码

using UnityEngine;

using System.Collections;

public class DelayDestroy : MonoBehaviour {

//需要初始化的所有属性

public void Init()

{

StartCoroutine(ReturnToPool());

}

//协程函数

IEnumerator  ReturnToPool()

{

yield return  new WaitForSeconds (2f);

ObjectPool.intance.Return(this.gameObject);

}

}

这是游戏效果

看到Ball(Clone)就是我们从对象池拿的对象,这样我们就可以提高我们游戏的性能,实现了游戏优化

时间: 2024-08-01 10:45:39

unity3D初识对象池技术的相关文章

对象池技术

在arpg页游场景里面,经常被杀的怪物对象需要反复生成.销毁.频繁的触发垃圾回收会降低游戏运行效率,对象池技术就是为了解决这种问题 对象池特点: 1.聚合有一个容器,该容器装有已生成的对象: 2.封装对象的生成操作: 3.封装对象的销毁操作: ============================================================ ==============简单的示例,可以自动扩容的对象池=========================== public cl

探索对象池技术

对象池技术是一种常见的对象缓存手段.’对象’意味着池中的内容是一种结构化实体,这也就是一般意义上面向对象中的对象模型:’池’(或动词池化)意味着将有生命周期的对象缓存到’池子’中进行管理,即用即取.缓存的目的大多是为了提升性能,对象池技术的目的也即如此.所以,对象池技术的本质简单来说就是:将具有生命周期的结构化对象缓存到带有一定管理功能的容器中,以提高对象的访问性能. 处理网络连接是对象池使用最多的场景.比如一些RPC框架的NettyChannel缓存(如motan),以及数据库连接池的Conn

屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToWorldPoint 3D打地鼠实例 我这里用到的素材都比较简陋,几乎全是用Unity做的 首先是锤子 就是两个Cylinder,在把手的位置放一个空物体用于模拟锤子的动作,命名为Hammer,把锤子作为Hammer的子物体,给Hammer添加Animation动画: 在三个关键帧位置设置Hammer

Unity3D中对象池的实现

在Unity中常常会遇到需要重复创建,销毁某些物体的情况,比如fps类游戏中的子弹,rpg类游戏中的小怪等等,如果直接使用Instantiate和Destroy的话,会浪费系统的资源,而使用对象池则能够节省下这些浪费. 这里使用一个重复利用子弹的进行发射的简单场景来演示对象池. 首先需要一个在场景中创建一个Cube,充当子弹. 然后在Assets目录下创建Resources文件夹,在Cube上添加上刚体,取消重力后,将Cube拖入Resources文件夹内作为一个预设,在场景中删除这个Cube.

as3 性能之对象池技术

优化 Adobe® Flash® Platform 的性能:http://help.adobe.com/zh_CN/as3/mobile/index.html 为什么使用对象池? 因为FLASH是托管的GC清理资源,具体什么时候清理只有GC知道,那么我们的游戏的性能就......... 例如:游戏里点击按钮会加载一张图片,再次点击图片,会销毁图片. 那么如果用户不停的点击,会执行不断的加载 显示 销毁.内存就会很难控制. 摘自Adobe的一段 http://help.adobe.com/zh_C

Unity3D 基于预设(Prefab)的泛型对象池实现

背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样的对象池才是好的呢,我们发现通用的对象池未必适应所有的环境,比如基于UI的局部(从某个Scene,到某个Dialog)对象池,范围不同,需要的对象池就有不同的要求.本文就是介绍一种基于预设(Prefab)的局部UI对象池. 通用信息提示窗口的实现http://www.manew.com/thread

大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark SQL0.3.1 RDD.DataFrame 与 DataSet0.3.2 DataSet 与 RDD 互操作0.3.3 RDD.DataFrame 与 DataSet 之间的转换0.3.4 用户自定义聚合函数(UDAF)0.3.5 开窗函数0.4 Spark Streaming0.4.1 Dst

对象池实现分析

对象池实现分析 什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池化技术最终要的就是重复的使用池内已经创建的对象.从上面的内容就可以看出对象池适用于以下几个场景: 创建对象的开销大 会创建大量的实例 限制一些资源的使用 如果创建一个对象的开销特别大,那么提前创建一些可以使用的并且缓存起来(池化技术就是重复使用对象,提前创建并缓存起来重复使用就是池化

Netty轻量级对象池实现分析

什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池化技术最终要的就是重复的使用池内已经创建的对象.从上面的内容就可以看出对象池适用于以下几个场景: 创建对象的开销大 会创建大量的实例 限制一些资源的使用 如果创建一个对象的开销特别大,那么提前创建一些可以使用的并且缓存起来(池化技术就是重复使用对象,提前创建并缓存起来重复使用就是池化)可以降低创建对