【Unity】对象池技术

【Unity】对象池技术

1.简介

对象池(Object Pooling)技术是一种用于优化游戏性能和内存管理的技术。
对象池可以用于各种需要频繁实例化和销毁游戏对象的场景,例如子弹、敌人、玩家等。其主要目标是减少频繁的内存分配和垃圾回收的次数,提高游戏的运行效率,从而提高性能和降低延迟。
在对象池中查找池中隐藏的游戏对象,将其显示出来,以避免一直实例化新的游戏对象,导致游戏性能受到影响。

2.实现

一般地,游戏会需要频繁实例化多种预制体,所以需要先将每种预制体存在各个小池中,接着通过大池进行管理,之后直接从大池中拿取和放回。

小池子(SubPool)代码

using UnityEngine;
using System.Collections.Generic;public class SubPool
{//预制体private GameObject m_prefab;//父对象private Transform m_parent;//小池中所有存在场景的对象private List<GameObject> m_objects = new List<GameObject>();/// <summary>/// 构造函数/// </summary>/// <param name="parent">父对象</param>/// <param name="prefab">预制体</param>public SubPool(Transform parent, GameObject prefab){m_parent = parent;m_prefab = prefab;}/// <summary>/// 预制体名字/// </summary>public string Name{get{return m_prefab.name;}}/// <summary>/// 生成/// </summary>/// <returns>生成的对象</returns>public GameObject Spawn(){GameObject go = null;foreach(GameObject obj in m_objects){if (!obj.activeSelf){go = obj;break;}}if(go == null){go = GameObject.Instantiate(m_prefab);go.transform.parent = m_parent;m_objects.Add(go);}go.SetActive(true);return go;}/// <summary>/// 是否存在小池中/// </summary>/// <param name="go">判断的对象</param>/// <returns></returns>public bool Contains(GameObject go){return m_objects.Contains(go);}/// <summary>/// 回收/// </summary>/// <param name="go">回收的对象</param>public void UnSpawn(GameObject go){if(Contains(go)){go.SetActive(false);}}/// <summary>/// 回收全部/// </summary>public void UnSpawnAll(){foreach(GameObject obj in m_objects){UnSpawn(obj);}}
}

大池子(ObjectPool)代码

using System.Collections.Generic;
using UnityEngine;public class ObjectPool : MonoBehaviour 
{//存放预制体的文件名public string FileName = "prefab";//名字-小池子字典private Dictionary<string, SubPool> m_pools = new Dictionary<string, SubPool>();/// <summary>/// 生成/// </summary>/// <param name="name">名字</param>/// <param name="parent">父对象</param>/// <returns>生成的对象</returns>public GameObject Spawn(string name, Transform parent){SubPool pool = null;if(!m_pools.ContainsKey(name)){RegisterNewPool(name, parent);}pool = m_pools[name];return pool.Spawn();}/// <summary>/// 注册新的小池子/// </summary>/// <param name="name">名字</param>/// <param name="parent">父对象</param>private void RegisterNewPool(string name, Transform parent){string path = FileName + "/" + name;GameObject go = Resources.Load<GameObject>(path);if(go != null){SubPool pool = new SubPool(parent, go);m_pools.Add(pool.Name, pool);}else{Debug.Log("未找到" + path + "的预制体");}}/// <summary>/// 回收/// </summary>/// <param name="go">被回收的游戏对象</param>public void UnSpawn(GameObject go){SubPool pool = null;foreach(SubPool p in m_pools.Values){if(p.Contains(go)){pool = p;break;}}if(pool != null){pool.UnSpawn(go);}}/// <summary>/// 回收全部/// </summary>public void UnSpawnAll(){foreach(SubPool p in m_pools.Values){p.UnSpawnAll();}}
}

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则邮箱_自己写一个通用的邮箱正则表达式

今天把正则又复习了一遍&#xff0c;为了加深记忆&#xff0c;自己写一个邮箱的正则表达式咱们先来看几个合法的邮箱地址hd33322nat123.commaksim.kim.82d-link.uavova_lazarev1969jaagers.comb4-service.szhaopinmail.com通过观察上面几个例子&#xff0c;不难看出所有邮箱地址…

[css][移动设备]禁止横竖屏时内容自动调整

参考&#xff1a;http://www.kankanews.com/ICkengine/archives/106643.shtml iOS下当竖屏转向横屏的时候&#xff0c;发现内容字体会自动变大&#xff0c;通过各种方法设置字体大小都失败了。 需要在body中设置如下&#xff1a; text-size-adjust: none;-ms-text-size-adjust…

python gettext_python gettext使用

python中使用gettext进行语言国际化的方法1.编辑源代码, 保存为gettextdemo.pyimport gettextcatalogs gettext.find("example", localedir"locale", allTrue)print catalogs:,catalogst gettext.translation(example, "locale", fallbackTrue…

python 数字、字符串与 time时间/日期 的转换

获取当前时间戳 >>> import time >>> num time.time() # 当前时间戳, 7位浮点 >>> type(num) <class float> >>> num 1623302086.1892786数字 转 时间 >>> t time.localtime(num) # 数字 转 时间 >>> type(t…

python基础版课件_python基础课件精编版.ppt

6.10 问题解答 (1)能不能像执行.exe文件那样执行.py文件呢&#xff1f; 在Windows上是不行的&#xff0c;但是&#xff0c;在Mac和Linux上是可以的&#xff0c;方法是在.py文件的第一行加上一个特殊的注释。 (2)在实际项目中&#xff0c;条件语句用的多还是循环语句用的多&…

Convert Windows 32bit dirver to Windows 64bit

Pre-condition: 1.source code(vc6.0WDK based) Development environment: 2.VS2013 3.WDK 8/8.1 Steps: 1.Create a new project. File->New->Visual C->Windows Driver 2.Copy .c and .h source code to project 3.Modify project property xxx属性页->配置属性-…

小程序 模糊查询_[轻应用小程序]如何使用信息查询功能?

本文内容结构如下图一、查询功能是什么&#xff1f;有什么作用&#xff1f;对于企业&#xff0c;会有一些和自身业务相关的数据&#xff0c;需要给到客户提供“查询信息”或“查询缴费”服务。查询信息&#xff1a;学校、培训机构&#xff1a;查询成绩。人力招聘&#xff1a;面…

LeetCode 1887. 使数组元素相等的减少操作次数(map)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;你的目标是令 nums 中的所有元素相等。完成一次减少操作需要遵照下面的几个步骤&#xff1a; 找出 nums 中的 最大 值。记这个值为 largest 并取其下标 i &#xff08;下标从 0 开始计数&#xff09;。如果…

input和output哪个是充电_input是什么接口?告诉大家这个小常识,以后音箱接线更容易...

很多网友都遇到过这样的问题&#xff0c;在电视、电脑、音箱、功放等设备的后面&#xff0c;经常会有很多接口&#xff0c;其中有的接口旁边写着“input”&#xff0c;那么input到底是什么接口呢 &#xff0c;今天就和大家聊聊这个问题。在字面意思来看&#xff0c;“input”翻…

python中的自测语句是什么?

if __name__ __main__:main() 以上转载于:https://www.cnblogs.com/Blaxon/p/4401949.html

mqtt协议详解_阿里云物联网平台使用心得(七)MQTT协议14个报文总览

大家好&#xff0c;物联网爱好小组成员超子&#xff0c;又和大家见面了&#xff0c;超子我能力有限&#xff0c;水平不高&#xff0c;有什么错误的地方&#xff0c;欢迎板砖。超子将参考《MQTT-3.1.1标准协议中文版》PDF手册&#xff0c;详解每个报文的格式&#xff0c;以及如何…

service启动activity_「 Android 10 四大组件 」系列—Service 的 quot; 启动流程 quot;

作者&#xff1a;DeepCoder核心源码关键类路径Service 的启动过程相对 Activity 的启动过程来说简单了很多&#xff0c;我们都知道怎么去创建和启动一个 Service&#xff0c; 那么你有没有从源码角度研究过 Service 启动后在系统层是如何运作的 &#xff1f;第一次看我文章的小…

天池 在线编程 输入流

文章目录1. 题目2. 解题1. 题目 描述 给出两个输入流 inputA 和 inputB(包含退格符), 如果两个输入流最后的结果相等&#xff0c;输出 YES&#xff0c;否则输出 NO。 输入字符只包括小写字母和<。 输入流长度不超过10000。示例 样例1 输入: inputA "abcde<<&q…

[LeetCode] Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Hide TagsTree Depth-first Search方法一&#xff1a;递归&#xff0c;也是dfs/*** Definition for binary tree* struct TreeNode {* int val;* TreeNode *left;…

python重命名窗口_为《Python实现批量重命名》程序加一个GUI

前一篇文章(Python实现批量重命名)&#xff0c;用Pyton做了一个批量重命名的小脚本程序&#xff0c;但是觉得这个用起来不太方便&#xff0c;于是想要进行一些改进&#xff0c;最好再加上GUI。一、首先&#xff0c;它的修改路径是写死在代码中的&#xff1a;# 图片存放的路径pa…

vim使用教程(全)-最好的编辑器 2015-04-09 18:26 40人阅读 评论(0) 收藏...

vim的学习曲线相当的大&#xff0c;所以&#xff0c;如果你一开始看到的是一大堆VIM的命令分类&#xff0c;你一定会对这个编辑器失去兴趣的。下面的文章翻译自《Learn Vim Progressively》&#xff0c;我觉得这是给新手最好的VIM的升级教程了&#xff0c;没有列举所有的 vim的…

mysql中有sa_SA工作-mysql设计规范

表的设计字段尽量设置not null&#xff0c;mysql的null值和空字符串不一样&#xff0c;null值占用空间&#xff0c;空字符串不占用空间。Null值占用空间&#xff0c;比较时会参与比较&#xff0c;但b树索引不会存储null值&#xff0c;因此当索引的字段包含null值&#xff0c;效…

天池 在线编程 最大子树(自底向上)

文章目录1. 题目2. 解题1. 题目 描述 给你一棵二叉树&#xff0c;找二叉树中的一棵子树&#xff0c;他的所有节点之和最大。 返回这棵子树的根节点。 我会把你返回的节点作为最优子树的树根来打印。 数据保证有且仅有唯一的解。 示例 样例 1: 输入: {1,-5,2,0,3,-4,-5} 输出…

sql随机抽取数据50条_MySQL中随机抽样

2.9 随机抽样在审计或IT审计中&#xff0c;常常使用抽样&#xff0c;也就是对具有审计相关性的总体中低于百分之百的项目实施审计程序&#xff0c;使所有抽样单元都有被选取的机会&#xff0c;为注册会计师针对整个总体得出结论提供合理基础。简单来说&#xff0c;就是我们需要…

mysql pdo 事务处理_php中pdo的mysql事务处理实例

phpmysql事务处理的几个步骤:1.关闭自动提交2.开启事务处理3.有异常就自动抛出异常提示再回滚4.开启自动提交注意:mysql只有这个InnoDB驱动是支持事务处理的&#xff0c;默认MyIsAM驱动不支持.下面是实例代码&#xff1a;<?php try{$pdonew pdo("mysql:hostlocalhost;…