Unity—游戏设计模式+GC

news2024/11/16 12:48:44

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

目录

状态模式:

外观模式

组合模式,

单例模式

命令模式

观察者模式

工厂模式

对象池模式

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(“”);

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

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


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

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

相关文章

FPGA开发软件(vivado + modelsim)环境搭建(附详细安装步骤+软件下载)

本文详细介绍了vivado软件和modelsim软件的安装&#xff0c;以及vivado中配置modelsim仿真设置&#xff0c;每一步都加文字说明和图片。一、软件安装包下载1、vivado vivado版本很多&#xff0c;目前最新的已更新到vivado2022.2&#xff0c;版本越高&#xff0c;安装包越大&…

90后阿里P7技术专家晒出工资单:狠补了这个,真香...

最近一哥们跟我聊天装逼&#xff0c;说他最近从阿里跳槽了&#xff0c;我问他跳出来拿了多少&#xff1f;哥们表示很得意&#xff0c;说跳槽到新公司一个月后发了工资&#xff0c;月入5万多&#xff0c;表示很满足&#xff01;这样的高薪资着实让人羡慕&#xff0c;我猜这是税后…

全局快门和卷帘快门(Global shutter and Rolling shutter)

全局快门和卷帘快门 “果冻效应”是什么&#xff1f;用相机拍下扇叶&#xff0c;为什么会发生扭曲变形&#xff1f; 相机两种曝光方式的优劣&#xff1a;全局曝光和卷帘曝光 卷帘快门和全局快门的区别 全局曝光和卷帘曝光是常见的相机曝光方式 一般来说&#xff0c;CCD相机是全…

【3D目标检测】Fastpillars-2023论文

论文&#xff1a;fastpillars.pdf https://arxiv.org/abs/2302.02367 作者&#xff1a;东南大学&#xff0c;美团 代码&#xff1a;https://github.com/StiphyJay/FastPillars &#xff08;暂未开源&#xff09; 讲解&#xff1a;https://mp.weixin.qq.com/s/ocNH2QBoD2AeK-…

「JVM 编译优化」javac 编译器源码解读

Java 的编译过程 前端编译: 编译器的前端&#xff0c;将 Java 文件转变成 Class 文件的过程&#xff1b;如 JDK 的 javac、Eclipse JDT 中的增量式编译器 ECJ&#xff1b;即使编译: JIT&#xff0c;Just In Time Compiler&#xff0c;在运行期将字节码转变成本地机器码的过程&…

COSELF 次元秀场伦敦时装周预告 #虚拟时尚

在虚拟世界里的未来服装&#xff0c;能自由变化自己的样貌和服饰。或许未来会作为人类皮肤的第二表征&#xff0c;极大解放人们的精神自由。COSELF 次元秀场 「预告」数字高定系列时间&#xff1a;本月 17 - 21 日地点&#xff1a;当季伦敦时装周「COSELF 次元秀场-数字高定系列…

excel图片技巧:如何为报表配上节日祝福动画

偶尔跳跃一下&#xff0c;改变一下&#xff0c;哪怕被说成是“拍马屁”也行&#xff0c;因为&#xff0c;快乐、传递快乐是一种幸福&#xff0c;是内心本身就有的欲望。提升自己在同事和领导心里的形象只是传递快乐的附加值。圣诞节就快到了&#xff0c;发送报表的时候附带一个…

vue的组件通信

文章目录3. 组件通信3.1 父组件-->子组件3.3组件自定义事件&#xff08;子->父&#xff09;3.4.全部事件总线&#xff08;两代以上&#xff09;3.5消息的订阅与发布3. 组件通信 3.1 父组件–>子组件 <Student name"张三" :age"18"></St…

Java Excel的数据导入导出

引入依赖 <!-- EasyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.7</version> </dependency><!--csv文件操作--> <dependency><groupId>n…

将ChatGPT整合到Word中

引言自ChatGPT出现&#xff0c;各种基于它的软件扩展纷至沓来&#xff0c;目前Word支持ChatGPT的add-in有两款&#xff0c;可以通过:插入->获取加载项->搜索openai查看。其中Ghostwriter从介绍上看功能比较单一&#xff0c;而且软件需要购买&#xff0c;用自己的API-key&…

php5.6.9安装sqlsrv扩展(windows)

报错:Marning: PHP Startup: Unable to load dynamic 1library D:lphpstudy_prolExtensionslphpl(phps.6.9ntslextphp_ pdo_sqlsry 56 nts′找不到指定的模块。in Unknown on line 0 整整搞了一天才终于解决 我用的是phpstudy_pro&#xff08;也就是小皮v8.1版本&#xff09;&…

Twitter多账号想要做到防关联?还是得靠它

接着上一篇Twitter养号攻略的文章&#xff0c;这篇龙哥就来详细讲讲当批量注册和管理Twitter账号时需要怎么防关联。 Twitter作为海外最流行的社交网站之一&#xff0c;它拥有很庞大的用户量&#xff0c;所以很多跨境电商都会通过Twitter来投放广告、推广自己的产品、提高曝光度…

pdf生成为二维码

当今数字时代&#xff0c;人们越来越依赖在线工具来处理各种任务&#xff0c;比如合并、拆分和压缩PDF等。Mai File就是这样一个在线工具&#xff0c;它可以将PDF文件转换成在线链接&#xff0c;方便您和他人轻松地查看和共享文件。 Mai File的使用非常简单&#xff0c;您只需…

从GPT到chatGPT(三):GPT3(二)

GPT3&#xff08;二&#xff09; 前言 因为上一篇文章 从GPT到chatGPT&#xff08;三&#xff09;&#xff1a;GPT3&#xff08;一&#xff09;阅读量挺高&#xff0c;给了我继续更新对该论文进行解读的莫大动力。这篇文章主要讲原论文的第三章&#xff08;Results&#xff0…

Vue2快速入门(三)前端项目架构搭建、Axios、Vue-Router

文章目录VueCli 4.3搭建前端项目架构创建vue项目前端项目目录结构添加axios添加cube-ui依赖创建新目录http客户端Axios什么是Axios&#xff1f;GET请求方式POST请求方式Axios封装通用后端请求API模块Vue-Router开发前端项目路由什么是vue-router&#xff1f;配置项目路由VueCli…

Hive SQL语言:DDL建库、建表

Hive SQL语言&#xff1a;DDL建库、建表 Hive数据模型总览 Hive SQL之数据库与建库 SQL中DDL语法的作用 ⚫ 数据定义语言(Data Definition Language, DDL)&#xff0c;是SQL语言集中对数据库内部的对象结构进行创建&#xff0c;删除&#xff0c;修改等的操作语言&#xff…

《反电信网络诈骗法》实行,Galaxybase图平台成为电信反诈黑科技

电信网络诈骗在当前的数字化生活中始终是一个高频讨论词。 近年来&#xff0c;随着互联网技术发展迅速&#xff0c;线上交易趋于频繁化&#xff0c;以电信网络诈骗为代表的新型网络犯罪行为也变得越来越高发。根据中国信通院《新形势下电信网络诈骗治理研究报告&#xff08;20…

交互式推荐在外卖场景的探索与应用

外卖场景的用户停留时长低于传统电商&#xff0c;对用户实时需求的理解和反馈有更高的要求。针对业务问题&#xff0c;外卖推荐团队从2021年起开始持续投入&#xff0c;最终摸索出了一套适用于外卖场景的交互式推荐架构和策略&#xff0c;并取得了较好的收益。下文将详细介绍外…

论文:拖曳线列阵拖曳噪声抑制的试验研究,阅读笔记

目录摘要目前的噪声来源和抑制的方法1.来源2.抑制方法针对流致振动引起的间接噪声提出解决方法1.结构减振优化设计2.扩大水听器与护套的间距实验1.如何划分对象组2.实验装置实验结果实验组1&#xff1a;结构减振优化设计的效果实验组2&#xff1a;扩大水听器与护套的间距的效果…

跨境电商卖家敦煌、雅虎、乐天、亚马逊测评自养号的重要性!

作为亚马逊、敦煌、乐天、雅虎等跨境的卖家&#xff0c;这两年以来&#xff0c;面对流量越来越贵的现实&#xff0c;卖家需要更加珍惜每次访问listing页面的流量&#xff0c;把转化做好&#xff0c;把流量尽可能转化为更多的订单。 提升转化率的技巧 提升产品转化率&#xff0…