翻开秘籍第一页:
问: 什么是类对象池?
剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景。如果我们不做任何的特殊处理,这种场景会出现两个性能问题——大量的内存碎片以及频繁的分配内存空间。 而对象池能供完美得解决这两个问题。
翻开秘籍第二页:
问: 什么原理?
剑之初: 当创建对象时,对象池将对象放入池管理的某种内存连续的数据结构中(数组或者栈等)。当不需要对象时,对象池并不销毁对象,而是将对象回收到池中,下次需要的时候再次从池中拿出来。
因为,对象储存在内存连续的数据结构中,所以解决了内存碎片的问题。
因为,对象每次用完以后就放回池中循环利用而不是再次创建和销毁,这样就解决了频繁的内存分配和销毁的问题。
翻开秘籍代码页:

#region 模块信息
//===================================================
// Copyright (C) 2020
//
// 文件名(File Name):              ClassObjectPool.cs
// 作者(Author):                  稀饭
// 邮箱(e-mail):                  1144000915@qq.com
// 创建时间(CreateTime):            2020-12-22 13:53:04
// 修改者列表(modifier):
// 模块描述(Module description):    创建脚本自动修改文件名、作者、创建时间
//===================================================
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace YouYou
{/// <summary>/// 类对象池/// </summary>public class ClassObjectPool : IDisposable{private Dictionary<int, Queue<object>> m_ClassObjectPoolDic;public ClassObjectPool(){m_ClassObjectPoolDic = new Dictionary<int, Queue<object>>();}/// <summary>/// 取出一个对象/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public T Dequeue<T>() where T:class,new(){lock(m_ClassObjectPoolDic){//先找到这个类对应的哈希值int key = typeof(T).GetHashCode();Queue<object> queue = null;m_ClassObjectPoolDic.TryGetValue(key, out queue);if(queue==null){queue = new Queue<object>();m_ClassObjectPoolDic[key] = queue;}//获取对象if(queue.Count>0){//说明队列中 有闲置的return (T)queue.Dequeue();}else{//如果队列中没有 实例化一个return new T();}}}/// <summary>/// 对象回池/// </summary>/// <param name="obj"></param>public void Enqueue(object obj){//先找到这个类对应的哈希值int key = obj.GetType().GetHashCode();Queue<object> queue = null;m_ClassObjectPoolDic.TryGetValue(key, out queue);if (queue != null){queue.Enqueue(obj);}}public void Dispose(){m_ClassObjectPoolDic.Clear();}}
}

翻开秘籍代码注解页:
问: 外部如何调用呢?
剑之初:
GameEntry.Pool.Dequeue(); 从类对象池中取出类对象
GameEntry.Pool.Enqueue(action); 对象回池

#region 模块信息
//===================================================
// Copyright (C) 2020
//
// 文件名(File Name):              TimeComponent.cs
// 作者(Author):                  稀饭
// 邮箱(e-mail):                  1144000915@qq.com
// 创建时间(CreateTime):            2020-12-15 16:10:51
// 修改者列表(modifier):
// 模块描述(Module description):    时间组件
//===================================================
#endregion
using System.Collections;
using System.Collections.Generic;
using UnityEngine;namespace YouYou
{/// <summary>/// 时间组件/// </summary>public class TimeComponent : YouYouBaseComponent, IUpdateComponent{protected override void OnAwake(){base.OnAwake();GameEntry.AddUpdateComponent(this);m_TimeManager = new TimeManager();}#region 定时器/// <summary>/// 定时器管理器/// </summary>private TimeManager m_TimeManager;/// <summary>/// 创建定时器/// </summary>/// <returns></returns>public TimeAction CreateTimeAction(){return GameEntry.Pool.Dequeue<TimeAction>();}/// <summary>/// 注册定时器/// </summary>/// <param name="action"></param>internal void RegisterTimeAction(TimeAction action){m_TimeManager.RegisterTimeAction(action);}/// <summary>/// 移除定时器/// </summary>/// <param name="action"></param>internal void RemoveTimeAction(TimeAction action){m_TimeManager.RemoveTimeAction(action);GameEntry.Pool.Enqueue(action);}#endregionpublic void OnUpdate(){m_TimeManager.OnUpdate();}public override void Shutdown(){m_TimeManager.Dispose();}}
}

Unity3D游戏开发之类对象池优化秘籍残篇相关推荐

  1. 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请

    文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...

  2. Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)

    今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游 ...

  3. Unity3D游戏开发-宣雨松读书摘要(2015-4-17 18:36)

    本书基于Unity3.5编写,通过丰富的游戏实例,以JavaScript与C#两种语言介绍Unity开发. Unity3D游戏开发-宣雨松 序 它支持JavaScript.C#.Boo三种脚本语言 ...

  4. Unity3D游戏开发之网络游戏服务器架构设计培训

    下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...

  5. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

  6. 利用对象池优化数据库操作

    简介:这是利用对象池优化数据库操作的详细页面,介绍了和asp.net,.Net,创建,对象池,示例有关的知识,要查看更多相关信息,请点击此处 说到对象池,大家都不陌生.很多人都实现过,网上的代码也满天 ...

  7. Unity3D游戏开发介绍

    Unity3D游戏开发介绍 Unity3D Unity是实时3D互动内容创作和运营平台.包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助Unity将创意变成现实. Unity平台提供一整 ...

  8. 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作

    在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...

  9. 2019该怎么学unity3D游戏开发?

    Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.怎么学 ...

最新文章

  1. PyTorch 笔记(01)— Ubuntu 使用 pip 清华源安装 PyTorch
  2. 知识蒸馏原来不是你想的那样子
  3. scala 学习心得
  4. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
  5. spring websocket源码分析续Handler的使用
  6. spring_整体系统
  7. pyqt5实现注册界面并获得文本框内容
  8. 如何构建一个真实的推荐系统?
  9. 数据库技术基础:查询优化相关知识笔记
  10. Java @SuppressWarnings注解
  11. 5年前我在博客中写的三目运算符的空指针问题,终于被阿里巴巴开发手册收录了。...
  12. NB-IOT使用小结
  13. 如何部署EDI系统?
  14. java web web.xml配置_web.xml配置详解
  15. Sublime 使用笔记(九):汉字乱码问题的解决方法
  16. js汉字排序(按照拼音)
  17. 计算机视觉期末复习(上)
  18. 克隆VirtualBox里的系统
  19. pycharm安装与配置Pyqt5
  20. 城南花未开,星海依然在

热门文章

  1. labview电子表格的写入
  2. java的Comparator接口详解
  3. 三角函数sin值域查表 sin值域表
  4. 字符数组转list集合
  5. 基于stm32单片机BMP180气压计海拔高度温度测量Proteus仿真
  6. Java 百度AI 写一个简单的手势识别程序
  7. 斐迅N1 刷armbian部署tensorflow ,开启人工智能之旅
  8. group convolution (分组卷积)的计算量详解、卷积计算量特征图大小,池化特征图大小、深度通道deep-wise 卷积
  9. excel之自动套用格式
  10. Java项目:基于springboot+vue的餐厅点定餐外卖系统—计算机毕业设计