引言:坚持更新,坚持更新,坚持更新。今日分享的是对象池的简单应用,从而有效优化内存。这里主要根据坦克大战的案例,讲解资源池的基本用法。项目使用的源文件在文末提供。本人也只是一名即将毕业的大学生,讲解如有不足的地方,各位客官还请提点!
开发版本: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,失败返回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(适合初学者)相关推荐

  1. Unity3D 内存管理

    此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/ Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用 ...

  2. Unity3D内存管理

    原文地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太 ...

  3. Unity3D 内存优化(一)对象池

    一.定义: 关于U3D内存优化,一直是游戏开发者头疼的事情,由于在项目中我们会频繁地创建和销毁一些对象,例如:怪物模型或者是UI预设体,但是,部分对象在游戏中是会频繁出现的,例如战斗中的小怪物,假如每 ...

  4. 【iOS沉思录】iOS内存管理试题总结与详解

    "iOS中的GC垃圾回收机制与内存管理机制以及block" 问题:僵尸对象.野指针.空指针分别指什么,有什么区别? 僵尸对象:一个OC对象引用计数为0被释放后就变成僵尸对象了,僵尸 ...

  5. 2万字|30张图带你领略glibc内存管理精髓(因为OOM导致了上千万损失)

    由于此文涉及内容较多,且malloc和free的流程图太大,导致被压缩,需要本文pdf或者高清 原图的,请关注公众号[高性能架构探索],也可以后台回复[pdf],获取计算机必备经典书籍 前言 大家好, ...

  6. BOOST内存管理(二) --- boost::pool

    Boost库的pool提供了一个内存池分配器,用于管理在一个独立的.大的分配空间里的动态内存分配.Boost库的pool主要适用于快速分配同样大小的内存块,尤其是反复分配和释放同样大小的内存块的情况. ...

  7. Unity3D资源加载与内存管理

    Unity3D资源加载与内存管理 Unity 3D中的资源加载 AssetBundle运行时加载: Unity3D占用内存太大怎么解决呢? 关于内存管理 举两个例子帮助理解 额外问题 Hog的评论引用 ...

  8. [内存管理]内存池pool库

    pool库概述 如果之前学过操作系统的内存管理机制和内存分配算法等知识,那么就了解"内存池"的概念. 简单地说,内存池预先分配了一块大的内存空间,然后就可以在其中使用某种算法实现高 ...

  9. ORACLE 内存管理 之六 SGA Multiple Block Sizes,Large Pool

    ORACLE DBA 内存管理 SGA Multiple Block Sizes,Large Pool Multiple Block Sizes 9i前只能设置一种blocksize,如果想改变只能重 ...

最新文章

  1. echarts切换折线图变大_这个月,我就和折线图杠上了...
  2. 保护SNMP协议服务安全的三个步骤
  3. jquery投色子动画
  4. HTML DOM Element 对象
  5. Java并发编程—线程同步类
  6. [python 进阶] 第7章 函数装饰器和闭包
  7. 严重漏洞已存在16年,数亿台打印机受影响
  8. 真·不怪云原生:探寻IT大厂逐渐云化的秘密!
  9. python数字合并提高_python-给定相关数字列表,合并相关列表以创...
  10. ubuntu11.04下如何发送文件到U盘如何添加发送文件到U盘的右键菜单
  11. wap游戏的一些理解
  12. 一.用matlab生成想要的分布数据——均匀分布
  13. 抓握手包破解wifi密码前传:WPA/WPA2加密小结
  14. java 判断日期格式_java判断字符是否是日期格式
  15. android 实现重力感应,Android重力感应实现方式是怎样实现的?
  16. HashMap常见面试考题
  17. 【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展
  18. adguard和adblock哪个好_世界上最高级的广告拦截程序AdGuard过滤规则分享
  19. [Web安全]信息收集
  20. macOS-允许打开任何来源的程序

热门文章

  1. 【架构】什么是架构,为什么大部分人做不了架构师?
  2. MES制造执行系统工艺管理介绍
  3. “投我以木桃,报之以琼瑶”的真正含义
  4. 使用批处理文件(.bat)批量在文件名前面加序号(递增)
  5. 如何把团队拉回到敏捷正轨︱瑞友科技项目群经理徐天岗
  6. 替换 Wonderware,云原生时序数据库 TDengine 助力工业数字化
  7. IPGuard客户端与应用程序冲突处理方法
  8. 程序员面试中最常见的几个问题,拿走不谢
  9. 嵌入式Iot(lot)是什么意思?(是iot不是LOT)
  10. 如何正确选择客流统计系统