Unity3D游戏开发之类对象池优化秘籍残篇
翻开秘籍第一页:
问: 什么是类对象池?
剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景。如果我们不做任何的特殊处理,这种场景会出现两个性能问题——大量的内存碎片以及频繁的分配内存空间。 而对象池能供完美得解决这两个问题。
翻开秘籍第二页:
问: 什么原理?
剑之初: 当创建对象时,对象池将对象放入池管理的某种内存连续的数据结构中(数组或者栈等)。当不需要对象时,对象池并不销毁对象,而是将对象回收到池中,下次需要的时候再次从池中拿出来。
因为,对象储存在内存连续的数据结构中,所以解决了内存碎片的问题。
因为,对象每次用完以后就放回池中循环利用而不是再次创建和销毁,这样就解决了频繁的内存分配和销毁的问题。
翻开秘籍代码页:
#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游戏开发之类对象池优化秘籍残篇相关推荐
- 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请
文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...
- Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)
今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游 ...
- Unity3D游戏开发-宣雨松读书摘要(2015-4-17 18:36)
本书基于Unity3.5编写,通过丰富的游戏实例,以JavaScript与C#两种语言介绍Unity开发. Unity3D游戏开发-宣雨松 序 它支持JavaScript.C#.Boo三种脚本语言 ...
- Unity3D游戏开发之网络游戏服务器架构设计培训
下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
- 利用对象池优化数据库操作
简介:这是利用对象池优化数据库操作的详细页面,介绍了和asp.net,.Net,创建,对象池,示例有关的知识,要查看更多相关信息,请点击此处 说到对象池,大家都不陌生.很多人都实现过,网上的代码也满天 ...
- Unity3D游戏开发介绍
Unity3D游戏开发介绍 Unity3D Unity是实时3D互动内容创作和运营平台.包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助Unity将创意变成现实. Unity平台提供一整 ...
- 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作
在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...
- 2019该怎么学unity3D游戏开发?
Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.怎么学 ...
最新文章
- PyTorch 笔记(01)— Ubuntu 使用 pip 清华源安装 PyTorch
- 知识蒸馏原来不是你想的那样子
- scala 学习心得
- jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
- spring websocket源码分析续Handler的使用
- spring_整体系统
- pyqt5实现注册界面并获得文本框内容
- 如何构建一个真实的推荐系统?
- 数据库技术基础:查询优化相关知识笔记
- Java @SuppressWarnings注解
- 5年前我在博客中写的三目运算符的空指针问题,终于被阿里巴巴开发手册收录了。...
- NB-IOT使用小结
- 如何部署EDI系统?
- java web web.xml配置_web.xml配置详解
- Sublime 使用笔记(九):汉字乱码问题的解决方法
- js汉字排序(按照拼音)
- 计算机视觉期末复习(上)
- 克隆VirtualBox里的系统
- pycharm安装与配置Pyqt5
- 城南花未开,星海依然在