当前位置:
首页 >
Unity3D内存管理之资源池Object Pool(适合初学者)
发布时间:2023/12/20
52
豆豆
生活随笔
收集整理的这篇文章主要介绍了
Unity3D内存管理之资源池Object Pool(适合初学者)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
引言:坚持更新,坚持更新,坚持更新。今日分享的是对象池的简单应用,从而有效优化内存。这里主要根据坦克大战的案例,讲解资源池的基本用法。项目使用的源文件在文末提供。本人也只是一名即将毕业的大学生,讲解如有不足的地方,各位客官还请提点!
开发版本:Unity 5.3.5f1
适合人群:适合初学者
三、代码实现
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,失败返回falsepublic bool PutBack(GameObject go){if (bulletList.Contains(go)){go.SetActive(false);return true;}return false;}
}
一、什么是资源池
将一定数量的对象预先存储在资源池中,当需要的时候使用,而不是每次都实例化一个对象,不用的时候再放回。例如一款射击类游戏,需要不断的发射子弹,如果每发射一颗子弹,都要实例化一个对象,随后再销毁对象,再实例化对象,必然会消耗较大的内存。如果预先就将子弹实例化出一定的数量,并保存在弹夹中,发射的时候,取出来发射,不用的时候,再放回弹夹。如此反复利用,可以避免频繁实例化和销毁带来的性能消耗。这里的弹夹的概念就是资源池模式!
二、实现思路
以之前小生的坦克大战为例(传送门: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,失败返回falsepublic 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!!!
总结
以上是生活随笔为你收集整理的Unity3D内存管理之资源池Object Pool(适合初学者)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 有机化学类毕业论文文献(推荐10篇)
- 下一篇: 机器视觉光源颜色选择