Unity3D内存管理之资源池Object Pool(适合初学者)

原创 2018年04月16日 14:27:49
引言:坚持更新,坚持更新,坚持更新。今日分享的是对象池的简单应用,从而有效优化内存。这里主要根据坦克大战的案例,讲解资源池的基本用法。项目使用的源文件在文末提供。本人也只是一名即将毕业的大学生,讲解如有不足的地方,各位客官还请提点!
开发版本:Unity 5.3.5f1
适合人群:适合初学者


一、什么是资源池

将一定数量的对象预先存储在资源池中,当需要的时候使用,而不是每次都实例化一个对象,不用的时候再放回。例如一款射击类游戏,需要不断的发射子弹,如果每发射一颗子弹,都要实例化一个对象,随后再销毁对象,再实例化对象,必然会消耗较大的内存。如果预先就将子弹实例化出一定的数量,并保存在弹夹中,发射的时候,取出来发射,不用的时候,再放回弹夹。如此反复利用,可以避免频繁实例化和销毁带来的性能消耗。这里的弹夹的概念就是资源池模式!

二、实现思路

以之前小生的坦克大战为例(传送门:https://blog.csdn.net/qq_35361471/article/details/79321304),来实现子弹的资源池功能。在游戏开始时,预先实例化30枚子弹在场景中,并且隐藏起来。当坦克发射子弹的时候,显示子弹。当子弹碰撞到物体爆炸时,将其隐藏起来。假设30枚子弹在同一时刻都在场景中使用(该游戏规模较小,30枚子弹足够了,但存在子弹不够的情况),则实例化新的子弹,提供使用。可以使用列表来存储实例化的子弹。使用流程图如下所示:


三、代码实现

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

public class BulletPool : MonoBehaviour
{
    public int count = 30;//预定义子弹的数量
    public GameObject bulletPrefab;

    private List<GameObject> bulletList = new List<GameObject>();//列表存储实例化的子弹

    private void Awake()
    {
        InitPool();
    }

    //初始化资源池
    private void InitPool()
    {
        for (int i = 0; i < count; i++)
        {
            CreatBullet();
        }
    }

    //实例化一个子弹,加入到列表中,并隐藏
    private GameObject CreatBullet()
    {
        GameObject go = Instantiate(bulletPrefab) as GameObject;
        bulletList.Add(go);
        go.transform.SetParent(transform);
        go.SetActive(false);
        return go;
    }

    //返回子弹列表中还没有使用的子弹对象,如果没有的话,则实例化新的子弹
    public GameObject GetBullet()
    {
        foreach (GameObject bullet in bulletList)
        {
            if (bullet.activeInHierarchy == false)
            {
                bullet.SetActive(true);
                return bullet;
            }
        }
        return CreatBullet();
    }

    //回收子弹到资源池中
    //回收成功返回true,失败返回false
    public bool PutBack(GameObject go)
    {
        if (bulletList.Contains(go))
        {
            go.SetActive(false);
            return true;
        }
        return false;
    }
}

源项目文件链接:链接:https://pan.baidu.com/s/1f1-nQtS3B30Q0-NVOr_TMg 密码:5ptj

共同努力学习Unity!!!

EJB商业探讨的白皮书

1 业界支持  任何一个商业化的技术要想拥有良好的市场态势,业界内重要企业的大量参与是十分重要的。J2EE是由SUN引导,各厂商共同发起的,并得到广泛认可的工业标准。业内企业计算领域的大企业如:IBM...
  • DrunkenLion
  • DrunkenLion
  • 2001-06-20 08:49:00
  • 660

设计模式之对象池模式(Object Pool)

http://blog.csdn.net/wcyoot/article/details/7584574 http://www.cnblogs.com/west-link/archive/2011/0...
  • yangqiang387393
  • yangqiang387393
  • 2016-05-19 10:21:09
  • 1458

C++内存管理变革(4):boost::object_pool与gc allocator

本文已经迁移到: http://cpp.winxgui.com/cn:gc-allocator-and-boost-object-poolC++内存管理变革(4): boost::object_poo...
  • xushiweizh
  • xushiweizh
  • 2007-04-21 20:59:00
  • 10839

资源池设计模式 (Resource Pool)和数据池的简单实现

本人摘自:http://sourcemaking.com/design_patterns/object_pool 翻译到了一半,感觉还是看原味的比较好点,翻译过的东西和原味的怎么都是有差别。有人想看的...
  • Array7
  • Array7
  • 2013-11-21 01:47:50
  • 4035

unity3D 内存管理——对象池(Object Pool)

原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C...
  • qq617119142
  • qq617119142
  • 2015-01-12 22:40:39
  • 662

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

原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C...
  • ykr168age
  • ykr168age
  • 2014-12-01 21:52:56
  • 539

三分钟让你学会如何使用 apache-common-pool2 创建自己的资源池

apache-common-pool2 如何使用
  • liang_love_java
  • liang_love_java
  • 2016-01-13 15:39:09
  • 7142

Unity3d中对象池(ObjectPool)的实现

转自:http://gad.qq.com/article/detail/7172110
  • u010377179
  • u010377179
  • 2016-10-26 08:25:58
  • 1960

vertica-资源池

语法 CREATE RESOURCE POOL pool-name ... [ MEMORYSIZE {'sizeUnits' |DEFAULT }] ... [ MAXMEMORYSIZE {...
  • u010522235
  • u010522235
  • 2016-05-25 21:30:49
  • 389

Hadoop Job 按组分资源池执行

hive在生产环境中由于用户数量和身份的不同,难免会对用户按组进行划分,根据不同组的优先级划分hadoop资源,hadoop fairscheduler支持按用户组划分资源池,每个group对应一个组...
  • jinjiating
  • jinjiating
  • 2014-09-16 16:19:53
  • 1565
收藏助手
不良信息举报
您举报文章:Unity3D内存管理之资源池Object Pool(适合初学者)
举报原因:
原因补充:

(最多只允许输入30个字)