Unity中对象池的使用
unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存。
对象池使用的基本思路是:
将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用。恰当地使用对象池,可以在一定程度上减少频繁创建对象所造成的开销。
并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。
代码如下所示:
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 public class GameObjectPool : MonoBehaviour { 6 //单例模式 7 private static GameObjectPool instance; 8 9 public static GameObjectPool Instance 10 { 11 get { return GameObjectPool.instance; } 12 set { GameObjectPool.instance = value; } 13 } 14 15 private static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList>{ }; 16 // Use this for initialization 17 void Start () 18 { 19 Instance = this; 20 } 21 public static Object Get(string prefabName, Vector3 position, Quaternion rotation) 22 { 23 string key = prefabName + "(Clone)"; 24 Object o; 25 //池中存在,则从池中取出 26 if (pool.ContainsKey(key) && pool[key].Count>0) 27 { 28 ArrayList list=pool[key]; 29 o=list[0] as Object; 30 list.Remove(o); 31 //重新初始化相关状态 32 (o as GameObject).SetActive(true); 33 (o as GameObject).transform.position = position; 34 (o as GameObject).transform.rotation = rotation; 35 } 36 //池中没有则实例化gameobejct 37 else 38 { 39 o = Instantiate(Resources.Load(prefabName),position,rotation); 40 } 41 return o; 42 } 43 44 45 public static Object Return(GameObject o) 46 { 47 string key = o.name; 48 if (pool.ContainsKey(key)) 49 { 50 ArrayList list=pool[key]; 51 list.Add(o); 52 } 53 else 54 { 55 pool[key] = new ArrayList(){ o}; 56 } 57 o.SetActive(false); 58 return o; 59 } 60 }
Unity中对象池的使用相关推荐
- [Unity] unity中对象池的使用
在现代游戏引擎设计中中,使用的大多都是托管内存,基于此我们不必手动管理内存,造成内存泄露等问题.对于unity中的游戏对象,每隔一段时间,Mono的垃圾回收机制将会检测内存,将没有再被引用的内存释放回 ...
- Java中对象池的本质是什么?(实战分析版)
简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...
- Unity 简易对象池
"每隔x秒随机产生10-20个物体(cube或者sphere),要求显示在屏幕上,并在x秒的显示后将其回收".看似简单的题目小菜也楞是在紧张中满头大汗的调试了两个小时左右才得以完成 ...
- Unity的对象复用
2019独角兽企业重金招聘Python工程师标准>>> 对象复用是 用空间换时间的一种典型的做法,对于Unity来说虽然引擎内部有GameObject的对象池,但是 这只是Nativ ...
- 池式结构:对象池(Object Pool)
本文是对 http://gameprogrammingpatterns.com/object-pool.html 的原创翻译.部分地方使用意译,不准确的地方请各位指证. 一.对象池的意义 通过重新使用 ...
- GameFramework框架详解之(四)对象池模块
GF对象池 一.前言 GF框架中对象池的使用,总共有三处 1.TaskPool任务池 2.RefrencePool引用池 3.EventPool事件池 4.ObjectPool对象池 首先使用原理都是 ...
- Android 内存优化-对象池★
1.对象池 内存优化不仅要防止内存泄露,也要注意频繁GC卡顿.内存抖动以及不必要的内存开销造成的内存需求过大或者内存泄露. 比如,如果有大量临时对象的创建该如何处理呢? 首先要确定问题发生的原因,对象 ...
- Unity中常用的单例模式、对象池的脚本模板,连按退出和滑动翻页或放大缩小的功能实现,以及属性在代码中的灵活使用
1.单例模式的脚本模板: Unity中针对一些常用的manager可以使用单例模式,用于统一的功能管理: //普通单例,不需要继承MonoBehavior,不用挂载在GameObject上 publi ...
- Unity中的资源管理-对象池技术(3)
本文分享Unity中的资源管理-对象池技术(3) 在上两篇文章中, 我们一起学习了普通类的两种对象池实现, 今天接着介绍Unity中GameObject(主要是预制实例化对象)的对象池. GameOb ...
最新文章
- C# 视频多人脸识别的实现过程
- SQL字符串基本操作汇总
- 微软企业服务部华东区招聘顾问/架构师/.NET高级开发员
- 美国诚实签经验——中英文行程单、往返机票、用英语面试的申请者通过率用中文面试的申请者的通过率、一直保持着微笑,看上去很自信,也很诚恳、户口簿带上最好...
- javaScript ie8 不支持 new Date(2017-07);只支持new Date(2017/07/01)
- 3分钟搞定 C++ if else 语句 05
- 2017.9.25 随机数生成器 失败总结
- Opencv4找不到CV_FOURCC
- SQL Server 2008支持将数据导出为脚本
- Centos7.4 安装Docker CE版
- html表格固定右侧列,jQuery锁定表头和固定列插件FixedTable
- linux vi恢复文件怎么打开文件,Linux上vi编辑文件非正常退出后文件恢复
- 企业邮箱哪个最好用?企业邮箱域名怎么注册? 企业邮箱哪个安全?
- 微信小程序JS 字符串string与arraybuffer的相互转换
- 女性bmi计算器JAVA代码_简单的BMI计算器
- (数据科学学习手札32)Python中re模块的详细介绍
- 真正的程序员职场高手,都是怎么沟通的?
- NDK-r25交叉编译qemu-7.0.0 第651步报错
- .NET平台开源项目速览(19)Power BI神器DAX Studio
- 计算机组成原理 最新教材,《计算机组成原理(本科教材)》—甲虎网一站式图书批发平台...
热门文章
- [置顶] mmog游戏开发之业务篇
- Oracle常用工具
- 自己拿项目,软件设计开发,释放你的力量
- Elasticsearch 参考指南(多索引)
- 使用Spring操作Redis的key-value数据
- Linux系统命令审计
- HibernateDaoSupport的使用
- “治沙女杰”殷玉珍:和沙漠较量的女人
- 使用MDT2012部署WindowsLinux操作系统(8)
- MySQL 超时解决方案mysql报错处理: could not be resolved: getnameinfo() returned error (code: -3)...