当前位置: 首页 > news >正文

Unity—游戏设计模式+GC

每日一句:"少年一贯快马扬帆 道阻且长不转弯 要盛大要绚烂要哗然 要用理想的泰坦尼克去撞现实的冰川 要当烧赤壁的风而非借箭的草船 要为一片海就肯翻万山。"

目录

状态模式:

外观模式

组合模式,

单例模式

命令模式

观察者模式

工厂模式

对象池模式

GC垃圾回收


状态模式:

当对象内部的状态发生变化时,其实也就是改变了它的行为,让对象看起来好像更改了类一样,这就是状态模式。

状态模式的代码实现:

示例:学生的日常生活

实现路径:创建一个状态的基类——>为睡觉、娱乐和学习分别创建一个状态类并继承状态基类——>修改代码,在不同的时间段加载不同的状态。

//抽象状态类,这里作为每个状态的父类

public abstract void class State
{//每个状态都要实现的抽象方法

public abstarct void Run();

}

//睡觉状态

public class SleepState:State
{ public override void Run()
{Debug.Log(睡觉状态的执行代码);}

}

//娱乐状态

public class PlayState:State
{ public override void Run()
{Debug.Log(娱乐状态的执行代码);}

}

//学习状态

public class StudyState:State
{ public override void Run()
{Debug.Log(学习状态的执行代码);}

}

//学生类

public class NewStudent

{ //每个学生都包含一个当前的状态

public State state;

//接受时间,并切换学生该时间段的状态

public void Run(int time)

{ if(time>22||time<7)

state=new SleepState();

  else if(time>=7&&time<=18)

state=new SleepState();

  else

state=new PlayState();

//调用改状态

state.Run();

}

public class StateTest:MonoBehaviour
{ void Start()

{

NewStudent student=new NewStudent ();

//做18点的事情

student.Run(18);

//做10点的事情

student.Run(10);

}

}

状态模式还有一个好处,那就是可以很方便地进行状态的复用,例如这时再加一个工人类,可以很方便地让这2个类使用同一个睡觉状态,所以当代码量越多,逻辑越复杂时更能体现状态模式的好处。

外观模式

为子系统提供一组统一的高层接口,使子系统更加容易使用,这就是外观模式。

外观模式可以将代码的复杂性封装起来并对外提供一个访问接口,让编程人员在使用时仅仅需要调用访问接口,而不需要关心内部复杂代码的实现和功能。

 

组合模式,

 

脚本之间的通讯

var xx=GetComponent<Walk>();

xx.Walk();

GetCompoenet()的性能问题

  1. 避免在Update中来使用GetComponent,否则性能代价过于昂贵
  2. 若多处地方使用GetComponent,尝试初始化获得组件的引用避免反复获取

单例模式

保证一个类只有一个实例,且具有全局访问点

public static Singleton Instance{get;private set;}

//将实例进行静态化static

void Awake()

{ //将实例进行静态化static

if(Instance!=null&&Instance!=this)

{Destroy(this;}

else

{Instance=this;}

}

优点:

单例模式只会在第一次请求时被创建,不会自主创建,节约内存

只存在一个对象进行运行,不用经历对象创建和销毁,节省性能

可以轻松的链接游戏各个模块

缺点:

随着项目增大,代码耦合度上升,维护困难

命令模式

将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化对请求排队或记录请求日志,以及支持可撤销的操作

 

观察者模式

定义了一个一对多的依赖关系,让多个观察者监听同一个主体对象,当主体对象发生变化时,会通知所有的观察者,使观察者可以自己进行更新。

public Action<> 人物死亡时事件;

if(Hp==0)

{人物死亡时事件.执行();}

 

代码层面,各管各的

执行层面,协同合作

工厂模式

定义一个创建对象的接口,让子类决定实例化哪一类,让类的实例化延迟到子类中进行,这就是工厂模式。

工厂模式提供了一种创建多种类型的对象的方式。试想一下,如果有不同品牌的汽车,那么购买汽车的人并不会关心汽车的生产过程,购买人只需要提供购买汽车的型号,就会得到对应型号的汽车,这个其实就是工厂模式。

实例:

实现路径:创建一个汽车抽象类—>创建多个汽车类并继承汽车抽象类—>创建一个汽车工厂类—>通过工厂类进行汽车的实例化

//汽车抽象类

public abstract class Car
{ public abstract void Run();}

public class Bmw:Car

{ public override void Run()

{ Debug.Log(宝马);

{
}

public class Benz:Car

{ public override void Run()

{ Debug.Log(奔驰);

{
}

public class Audi:Car

{ public override void Run()

{ Debug.Log(奥迪);

{
}

//汽车类型

public enum CarType
{ Bmw,

Benz,

Audi

}

//工厂类

public class Factory

{//创建汽车对象的方法,这里将3种汽车的实例化方法封装起来

public static Car Create(CarType type)

{Car car=null;

switch(type)

{case CarType.Bmw:

car=new Bmw();

break;

case CarType.Benz:

car=new Benz();

break;

case CarType.Audi:

car=new Audi();

break;

}

return car;

}

}

public class FactoryTest:MonoBehaviour
{ void Start()

{//创建3种不同类型的汽车,这里看到实例化方法被封装起来了

 //所以调用我们自己的创建方法就可以了,不必在意内部的创建过程

Car bmw=Factory.Create(CarType.Bmw);

bmw.Run();

Car benz=Factory.Create(CarType.Benz);

benz.Run();

Car audi=Factory.Create(CarType.Audi);

audi.Run();

}

}

在创建对象时,由于类的实例化过程已经被隐藏了起来,因此使用了统一的创建方法。这样当类型数量过多的时候,使用起来会十分方便,并且具有很好的扩展性,可以随时对封装的类进行修改或添加。

对象池模式

GC垃圾回收

值类型

当局部变量超出作用域时,会自动将那些产生的内存进行释放(性能开销小)

 

在执行垃圾回收时会检查整个堆,因此会造成卡顿

加载界面可以手动进行回收,System.GC.Collect()

如何避免产生常见的Unity垃圾?

不断在堆中分配内存,产生数组

void Update()
{Physics.RaycastAll(new Ray());}


协程返回会创建一个引用类型数据

IEnumerator Wait()
{yield return new WaitForSeconds(s);}

所以如果有多个协程存在着相同的等待时间,

可以将它提取出来进行赋值


实例化对象产生大量垃圾

所以用对象池实例化

调试日志产生大量垃圾——>Debug.Log(“”);

所以构建发布游戏之前关闭日志消息功能

只要不在每一帧的函数里,持续创造大量垃圾就行


相关文章:

Unity—游戏设计模式+GC

每日一句&#xff1a;"少年一贯快马扬帆 道阻且长不转弯 要盛大要绚烂要哗然 要用理想的泰坦尼克去撞现实的冰川 要当烧赤壁的风而非借箭的草船 要为一片海就肯翻万山。" 目录 状态模式&#xff1a; 外观模式 组合模式&#xff0c; 单例模式 命令模式 观察者模…...

【刷题笔记】--二分查找binarysearch

当给一个有序的数组&#xff0c;在其中查找某个数&#xff0c;可以考虑用二分查找。 题目1&#xff1a; 二分查找的思路&#xff1a; 设置left和right指针分别指向要查找的区间。mid指针指向这个区间的中间。比较mid指针所指的数与target。 如果mid所指的数小于target&…...

Python版本的常见模板(二) 数论(一)

文章目录前言质数相关质数判断求约数求取区间质数埃氏筛法线性筛法分解质因数欧拉欧拉函数求取单个数线性筛法求取欧拉定理求逆元快速幂/幂取模欧几里得算法求最小公约数拓展欧几里得算法求解同余方程前言 本文主要是提供Python版本的常见的一些与数论相关的模板&#xff0c;例…...

SQL快速上手(知识点总结+训练资料)

文章目录一 SQL训练资料二 SQL知识点总结1.SQL语句的执行顺序2.窗口函数3.字符串处理函数模糊查询三 SQL题目的总结一 SQL训练资料 牛客SQL题目 猴子数据分析题目 关注的公众号 猴子数据分析 二 SQL知识点总结 1.SQL语句的执行顺序 每一个子句产生的中间结果供接下来的子句…...

无需经验的steam搬砖,每天操作1小时,轻松创业赚钱!

我作为一个95后社畜&#xff0c;就喜欢倒腾各种赚钱的事情&#xff0c;8年老韭菜告诉你&#xff0c;副业创收一点都不难&#xff0c;难就难在是否找对项目&#xff0c;俗话说方向不对&#xff0c;努力白费&#xff01; 什么做苦力、技能、直播卖货&#xff0c;电商等等对比我这…...

如何创建你的公司的FAQ页面?

很多企业考虑为公司搭建一个“常见问题”页面&#xff0c;作为帮助客户回答关于产品和服务的常见问题的一种方式。 FAQ页面和登录/销售页面不同&#xff0c;没有展现出直接的投资回报&#xff0c;但是为团队节省了其他成本&#xff0c;据了解&#xff0c;高达67%的客户相比于跟…...

CK-GW06-E03与欧姆龙PLC配置指南

CK-GW06-E03与欧姆龙PLC配置指南CK-GW06-E03是一款支持标准工业EtherCAT协议的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无POE供电功能的交换机时可采用外接电源供电&#xff1b;系统还集成了六…...

使用docker-compose部署RocketMQ5.0

简介&#xff1a;使用docker-compose部署rocketmq5.0。文中会介绍docker-compose版本以及需要注意的项第一步&#xff1a;进入hub.docker.com搜索rocketmq我们选择第一个&#xff0c;因为第一个是7个月前更新的&#xff0c;&#xff08;我看有很多博客使用的依旧是最下面的那种…...

嵌入式ARM设计编程(四) ARM启动过程控制

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 &#xff08;1&#xff09; 掌握建立基本完整的ARM 工程&#xff0c;包含启动代码&#xff0c;C语言程序等&…...

企业维基都说好,今天我们来看看 wiki 软件的缺点有哪些?

企业维基企业wiki和内部知识库可能看起来是一回事——但它们实际上是非常不同的软件类型。也许您可能不知道你在寻找的是知识基础软件&#xff0c;还是wiki软件。 无论哪种方式&#xff0c;缺乏知识都是生产力的巨大瓶颈。事实上&#xff0c;未能分享知识是财富500强企业每年亏…...

08- 汽车产品聚类分析综合项目 (机器学习聚类算法) (项目八)

找出性价比较高的车 LabelEncoder: python:sklearn标签编码(LabelEncoder) sklearn.preprocessing.LabelEncoder的使用&#xff1a;在训练模型之前&#xff0c;通常都要对数据进行一定得处理。将类别编号是一种常用的处理方法&#xff0c;比如把类别“电脑”&#xff0c;“手机…...

揭开苹果供应链,如何将其命运与中国深度捆绑

前 言 诺基亚在2007年时拥有9亿用户&#xff0c;在手机市场上占据主导地位&#xff0c;福布斯在当时以“谁能赶上手机之王&#xff1f;”为标题刊登了一篇关于该公司的报道&#xff0c;与此同时&#xff0c;苹果公司推出了iPhone系列产品。16年后&#xff0c;苹果公司以充足的…...

Mybatis 之useGeneratedKeys注意点

一.例子 Order.javapublic class Order {private Long id;private String serial; }orderMapper.xml<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd…...

数据结构---时间复杂度

专栏&#xff1a;数据结构 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;开学数据结构&#xff0c;接下来会慢慢坑新数据结构的内容&#xff01;&#xff01;&#xff01;&#xff01; 时间复杂度前言1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1大…...

如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全?

第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全&#xff1f; 我在之前两讲介绍了 Java 集合框架的典型容器类&#xff0c;它们绝大部分都不是线程安全的&#xff0c;仅有的线程安全实现&#xff0c;比如 Vector、Stack&#xff0c;在性能方面也…...

C++对象模型和this指针

成员变量和成员函数分开存储&#xff1a;基本概念&#xff1a;在C中&#xff0c;类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上每个空对象都会有一个独一无二的内存地址&#xff0c;所以&#xff0c;空对象占用内存空间的大小为1代码实现&#xff1a;#i…...

kubernetes教程 --Pod调度

Pod调度 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某…...

功率放大器科普知识(晶体管功率放大器的注意事项)

虽然功率放大器是电子实验室的常用仪器&#xff0c;但是很多人对于它却没有清晰的认识&#xff0c;下面就让安泰电子来为大家介绍功率放大器的科普内容以及使用注意事项&#xff0c;希望大家可以对功率放大器有清晰的认识。功率放大器可以把输入信号的功率放大&#xff0c;以满…...

CentOS 7转化系统为阿里龙蜥Anolis OS 7

转载&#xff1a;原社区CentOS 7迁移Anolis OS 7迁移手册 一、注意事项 Anolis OS 7生态上和依赖管理上保持跟CentOS7.x兼容&#xff0c;一键式迁移脚本centos2anolis.py&#xff0c;实现CentOS7.x到Anolis OS 7的平滑迁移。 使用迁移脚本前需要注意如下事项&#xff1a; 迁…...

【快速复习】一文看懂 Mysql 核心存储 隔离级别 锁 MVCC 机制

一文看懂 Mysql 核心存储 & 隔离级别 & 锁 & MVCC 机制 Mysql InnoDB 引擎下核心存储 数据&索引存储 IBD 文件 mysql 实际存储采用 B 树结构。 B 树是一种多路搜索树&#xff0c;其搜索性能高于 B 树 所有叶节点在同一深度&#xff0c;保证搜索效率仅叶节…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...