对象池ObjectPool的简单实现

我对对象池的简单理解:当一个游戏需要产生大量游戏物体又需要频繁销毁时,可用一个对象池将游戏物体存储起来。目的是优化内存。

以下两篇我参考过觉得OK的博文:

https://blog.csdn.net/u013236878/article/details/52443066

https://www.jianshu.com/p/6133fb7e0819

unity内简单实现一下:

1.canvas下新建空物体命名为07_ObjectPool,新建一个cube

2.创建一个脚本,内容如下,挂载在空物体上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 对象池
/// </summary>
public class ObjectPool : MonoBehaviour {

    //获取资源
    public GameObject monster;
    //怪物对象池
    private Stack<GameObject> monsterPool;
    //当前游戏世界里存在的或者说已经激活的怪物对象
    private Stack<GameObject> activeMonsterList;

	// Use this for initialization
	void Start () {
        monsterPool = new Stack<GameObject>();
        activeMonsterList = new Stack<GameObject>();
	}

	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            //如果我们需要游戏物体时我们要从池的管理内取
            GameObject itemGo = GetMonster();
            //做后续工作
            itemGo.transform.position = Vector3.one;
            activeMonsterList.Push(itemGo);
        }else if (Input.GetMouseButtonDown(1))
        {
            if (activeMonsterList.Count > 0)
            {
                if (activeMonsterList.Count > 0)
                {
                    //如果我们不适用或者销毁了当前怪物对象
                    //那么我们需要直接把怪物对象扔进池子
                    PushMonster(activeMonsterList.Pop());
                }
            }
        }
	}

    private GameObject GetMonster()
    {
        GameObject monsterGo = null;
        if (monsterPool.Count<=0)       //如果池子里没有怪物对象
        {
            monsterGo = Instantiate(monster);
        }
        else                            //池子有怪物对象
        {
            monsterGo = monsterPool.Pop();
            monsterGo.SetActive(true);
        }
        return monsterGo;
    }

    private void PushMonster(GameObject monsterGo)
    {
        monsterGo.transform.SetParent(transform);
        monsterGo.SetActive(false);     //令不使用的游戏对象失活
        monsterPool.Push(monsterGo);
    }
}

  

3.把创建的cube赋给monster对象,鼠标左键创建,右键销毁。可见右键销毁时并没有真正把物体销毁掉,而只是隐藏了起来,等到下一次左键创建新物体时再把隐藏的物体现实出来,这样就达到了节约内存的效果。只有当隐藏的对象全部都显示完毕但仍然在进行创建操作时,才会真正实例化一个物体。

末尾补充:对象池只需要一个,为此对象池应该被设计应用到一个安全的模式,所以要采用单例模式。我对单例模式的理解:类似于当前CPU只能运行一个进程,在运行这个的时候其他进程就不能抢占资源,补充一篇博文,里面讲解较为详细。(里面的模式代码粗略看了一下有点PV操作问题的感觉。。)

https://blog.csdn.net/jason0539/article/details/23297037

先发了有坑后面填

原文地址:https://www.cnblogs.com/LinawZ/p/12293533.html

时间: 2025-01-18 03:37:46

对象池ObjectPool的简单实现的相关文章

as3 性能之对象池技术

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

游戏编程模式-对象池

“使用固定的对象池重用对象,取代单独的分配和释放对象,以此来达到提升性能和优化内存使用的目的.” 动机 假设我们正在致力于游戏的视觉效果优化.当英雄释放魔法时,我们想让一个火花在屏幕上炸裂.这通常需要一个粒子系统(一个用来生成大量小的图形并在它们生存周期产生动画的引擎)来实现.而这个粒子系统实现这个火花的时候会产生大量的粒子,我们需要非常快速的创建这些粒子同时在这些粒子“死亡”的时候释放这些粒子对象.在这里,我们会碰到一个严重的问题——内存碎片化. 碎片化地害处 为游戏和移动设备编程在很多方面都

ObjectPool 对象池设计模式

Micosoft.Extension.ObjectPool 源码架构.模式分析: 三大基本对象: ObjectPool抽象类 ObjectPoolProvider抽象类 IPooledObjectPolicy接口 ObjectPool的默认实现是DefaultPool,对象池的创建由ObjectPoolProvider抽象类的默认实现DefaultObjectPoolProvider类实现. public class DefaultObjectPoolProvider : ObjectPoolP

C++实现简单的对象池

对象池的实现其实是非常简单的 思想也是很简单的: 用一个队列来存放所有的对象,需要时get一个对象,从队列头取一个对象,当用完后,重新将该对象投入到队列尾部. #ifndef OBJ_POOL_H_ #define OBJ_POOL_H_ #include <queue> #include <memory> #include <stdexcept> using std::queue; using std::shared_ptr; template <typenam

对象池的简单实现

1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class GameInstatie : MonoBehaviour { 6 7 private Stack<GameObject> GameManager = new Stack<GameObject>();//未激活怪我的对象池 8 private Stack<GameObject&

对象池的简单使用

using System.Collections; using System.Collections.Generic; using UnityEngine; public class DemoPool : MonoBehaviour { //要实例的物体 public GameObject monsterPrefab; //存放物体的对象池 未激活 private List<GameObject> monsterList = new List<GameObject>(); //激活

深度剖析C++对象池自动回收技术实现

http://www.tuicool.com/articles/mQBfQfN 对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用.这种方式避免了重复创建耗时或耗资源的大对象,大幅提高了程序性能.本文将探讨对象池的技术特性以及源码实现. 对象池类图 ObjectPool:管理对象实例的pool

[译]Unity3D内存管理——对象池(Object Pool)

从一个简单的对象池类开始说起 对象池背后的理念其实是非常简单的.我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象.池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象.该模式可以用以下简单的几行代码实现: public class ObjectPool<T> where T : class, new() { private Stack<T> m_objectStack = new Sta

Unity对象池试水

其实接触对象池这个概念已经很久了,网上也有很多现成的插件,比较有名的是PoolManager,功能听说很完善,我并没有细看.现在我想根据网上的一些案例和教程写一个应用于现在这个项目的小ObjectPool,这里有一篇文章对ObjectPool有一定的解释,有兴趣的可以看看.我项目里面有几十个反复要使用的模型,就在这一块下手吧,主要来实现存取两块代码,为了便于检索采用List<T>来实现存取. using UnityEngine; using System.Collections; using