- 博客(36)
- 收藏
- 关注
原创 服务定位器模式
为某服务提供一个全局访问入口来避免使用者与该服务具体实现类之间产生耦合。(摘自《游戏编程模式》)对于一些在游戏系统各处都可能调用的系统、对象或函数,如果(利用静态类或单例模式)直接调用也会造成一定的耦合——当我们对静态类或单例模式的调用方式进行修改时,我们就需要找到各个调用的代码块并进行修改,而使用服务定位器模式可以解决这个问题。你可以把服务定位当成一个单例模式的集合类,在服务定位器类中,可以汇集大量的静态实例。当我们需要某个实例是,通过静态变量即可获取并调用。示例代码简单的定位器类clas.
2021-11-03 10:36:10
359
原创 游戏编程模式之事件队列模式
对消息或事件的发送与受理进行时间上的解耦。(摘自《游戏编程模式》)事件队列模式维护着一个事件队列。元命令入队意味着我们主观想要立即想要执行该命令的相关操作;而出队意味着响应执行该命令相关的操作。受限于各种硬件和软件的情况,这些命令执行并不是立即响应的,但顺序是固定的、也不会出现命令遗漏的情况。我们使用事件队列模式,很重要的目的就是序列唯一且不会遗漏。这一模式适合管理对实时要求不算高的命令响应。和这以模式类似的有:观察者模式和命令模式。但是他们之间的思考方向和解决的问题是不一样的。观察者模式、命令模.
2021-10-30 17:05:44
1419
原创 游戏编程模式之组件模式
允许一个单一的实体跨越多个不同域而不会导致耦合。(摘自《游戏编程模式》)组件模式又是一个采用“Have One”实现多态的模式。从客观上来说,Unity引擎的GameObject就是使用组件尤为成功的例子。在使用Unity开发中,我们可以给一个GameObject添加引擎自带或自己编写的组件。下图展示了某个项目中一个VR人物游戏对象上面绑定的组件,我们将从这个案例中引入我们即将介绍的组件模式。根据图片,VR角色模型绑定了Transform、Animator、VRIK、CalibrateSize、.
2021-10-28 15:55:46
1883
原创 游戏编程模式之类型对象模式
通过创建一个类来支持新类型的灵活创建,其每个实例都代表一个不同的对象类型。(摘自《游戏编程模式》)有两种实现多态的方式,“Have One”和继承。而类型对象模式就是运用“Have One”。类型对象模式的处理和享元模式类似,都是需要将一类对象的共有部分独立成一个类并采用“Have One”将其一一对应起来。两者的区别主要在于:类型对象模式独享一个实例;而享元模式是通过指针共享一个相同实例。事实上,类型对象模式的主要目的就是简化继承树的规模。假设我们开发的游戏用100种怪物,每一种怪物都有一个共.
2021-10-27 14:54:44
224
原创 游戏编程模式之父类沙盒模式
使用基类提供的操作集合来定义子类中的行为。(摘自《游戏编程模式》)沙盒(英语:sandbox,又译为沙箱)是一种安全机制,为运行中的程序提供的隔离环境。(摘自维基百科)在我看来,子类沙盒模式就是一种是代码更紧凑为目的的模式,它更好的约束了程序员对继承的肆意使用。为什么这么说呢?首先我们要了解什么是子类沙盒。上面的引用也提到了沙盒的定义,那么,子类沙盒实质上就是将子类需要用到的相同操作(函数)全部整合到父类中实现。对各个模块函数、遍历、实例的引用全部让父类去做,这样就能避免这一类跨模块调用的代码散.
2021-10-27 14:53:03
263
原创 游戏编程模式之字节码模式
通过将行为编码成虚拟机指令,而使其具备数据的灵活性。(摘自《游戏编程模式》)游戏是一个庞大的工程,因此,在开发的过程中我们会选用高稳定性和高效率的重型语言,例如C++。C++的每一次代码更新都需要编译,然而庞大的代码量使得编译时间变得很长。因此,我们需要想办法将可自定义性高、变动可能性高的部分从代码主干中剥离出来(而游戏代码中恰好有很多部分符合这个要求),这样的代码极大的减少每一次更改后需要重新编译的次数。这就是字节码模式最根本的目的。至于其实现原理,很简单,将可变动内容(数值、执行指令、简单逻辑.
2021-10-27 14:51:33
213
原创 游戏编程模式之更新模式
通过对所有对象实例同时进行帧更新来模拟一系列相互独立的游戏对象。(摘自《游戏编程模式》)游戏状态更新最好由游戏循环进行调用,而非重新编写while()循环代码,但当我们使用Unity开发游戏的时候,我们有接触到游戏循环的代码吗?我们如何将需要实时调用的代码添加到游戏循环中?相比Unity开发者都很熟悉,每个脚本中都可以添加以下函数:private void Update(){ //每帧调用的代码...}这就是更新模式的运用。引擎只负责将所有的Update()方法放在游戏循环中调用,.
2021-10-22 10:48:14
954
原创 游戏编程模式之游戏循环
实现用户输入和处理器速度在游戏行进时间上的解耦。(摘自《游戏编程模式》)游戏作为一个实时互动软件,实时是其核心。在程序里,总有那么一段代码一直在软件运行周期里不断重复着以监听着用户的输入,并根据输入进行对应的响应,这就是游戏循环代码。要注意的是,在游戏循环中不会出现类似UI事件循环中的阻塞,即使你不输入,游戏依旧在运行着游戏循环。试着将游戏逻辑简化为输入处理ProcessInput()、逻辑更新LogicUpdate()、画面渲染Render()、物理更新PhysicUpdate()三个部分(事实.
2021-10-22 10:04:50
1786
原创 游戏编程模式之双缓冲模式
问题引入尽管计算机的处理能力相比过去有了极大的进步。但对于实时渲染的游戏程序,仍旧不能在一瞬间将同屏的所有物件全部加载出来。即使可以,用户的硬件条件参差不齐,若运行在性能较低的机器,用户将看到破碎断续加载的画面。从更底层形象地看断续加载的原因,就要了解画面是如何绘制的。计算机维护着一个帧缓冲区,游戏想要显示画面,就需要将像素颜色信息填写到帧缓冲区中。而显示设备就从帧缓冲区中读取像素信息并会知道屏幕上。这时候就会出现一个同步问题——当显示设备从帧缓冲区读取到计算机未填充的信息时,就会照成原本想要绘制的画面
2021-10-21 10:24:35
268
原创 游戏编程模式之状态模式
允许一个对象在其内部状态改变时改变自身的行为。对象看起来好像是在修改自身类。。(摘自《游戏编程模式》)我们熟悉的名词:有限状态机(finite state machines,fsm)就是状态模式的应用。正如Unity 的动画状态机。状态机根据上面给出Unity游戏引擎的Animator状态机可以看出,在状态机中,无论任何时刻,在状态中只有一种激活状态。这就是状态模式最鲜明的特点。如何构造自己的状态机呢?我们需要进行如下步骤:枚举所有的状态,并且在这组状态之间可以相互转换。确定在这种状态中.
2021-10-20 15:40:11
155
原创 [Unity] Unity Cursor 样式设置和API解析
一直以来使用Unity没有系统的使用 Unity Cursor 样式等的修改,其实也就几个变量和函数。现在做项目正好总结CursorLockMode 枚举,赋值变量:Cursor.lockStateCursorLockMode.None:无限制状态(相对与后面两个枚举量)CursorLockMode.Locked :锁定后,光标将放置在视图的中心,并且无法移动。不管Cursor.visi...
2020-03-02 22:39:00
3718
原创 [Daily]用一个栈实现另一个栈的排序
【问题】一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?【分析】利用栈访问的特性(FILO),将每一个数放在正确的位置,直到stack栈为空,最后将help一并压入stack栈中。help应为所要求有序数列的逆序(因为最后要压入stack中)算法步骤解析:cur :int ...
2020-03-01 12:34:50
185
原创 [Daily]猫狗队列——”子类管理器“
【题目】有猫狗类如下:class Pet{ private: string m_type; public: Pet(string _type){ m_type=_type; } string GetPetType(){ return m_type; }};class Dog : public Pet...
2020-03-01 09:23:52
163
原创 [Daily]仅用递归函数和栈操作逆序一个栈
【题目】一个栈依次压入1,2,3,4,5;那么从栈顶到栈底分别为5,4,3,2,1.。将栈转置【要求】只能用递归函数来实现。【分析】该算法需要两个递归函数。分别是getAndRemoveLastElement()和Reverse()函数名描述getAndRemoveLastElement将栈Stack的栈底元素返回并移除。作为中间步骤被Reverse使用...
2020-02-29 18:21:24
196
原创 [Daily]利用两个栈实现队列
【题目】编写一个类,用两个栈实现队列,支持队列的基本操作(enQueue、deQueue、peek)【分析】队列的访问规则是First In First Out;栈的访问规则是First In Last Out。用栈来模拟队的访问规则,核心思想就是:将入栈的顺序逆序,然后再出栈根据上面的核心思想,不难看出,我们可以使用两个栈,一个存储队列的入队顺序,一个存储队列的出队顺序入队栈和...
2020-02-29 10:48:08
105
原创 [Daily]设计一个获取最小值时间复杂度为O(1)的栈
【题目】实现一个栈,在实现栈的基本功能的前提下,再实现返回最小元素的操作。【要求】pop、push、getMin操作的时间复杂度都是O(1)设计的类可以使用现成的栈结构。【分析】想要使得获取最小值的时间复杂度为O(1),最简单的方法就是提前将最小值记录下来,当我们需要获取时便可直接获取栈的特点就是先进后出。它的操作具有一定规律,这使得我们可以很好的记录最小值。很容易就能够...
2020-02-28 23:35:07
561
原创 有符号整型最大最小值计算问题分析
今天在学习《Lua程序设计(第四版)》时,看到了一道课后习题,觉得很有意思。下面是一些关于题目涉及到的知识点:Lua的数值范围是:math.maxinteger、math.mininteger(5.3版本)标准Lua使用64bit来表示数值,精简Lua使用32bit存储整型值在数学领域,回环是结果只能在math.mininteger和math.maxinteger之间。也就是对2的64次方...
2020-01-12 22:34:20
1502
1
原创 记一次面试准备(续上)
稀里糊涂进了面试。感觉爬过了笔试,什么都是赚的。但该准备还是准备,生活就是由一个个偶然走向必然。(考研后遗症,马基知识点)这次知识点主要是围绕着牛客网的C++面试小册子进行复习。相信自己平时自己的积累。*可我还是很慌~~~~~*基础知识static关键字:分为全局静态变量 、局部静态变量、静态函数、类的静态成员、类的静态函数C++的四种转换。static_cast,...
2020-01-06 15:26:17
133
原创 记面试某公司的一次笔试准备
综述这次笔试的内容有点多,且有两门科目我是从来没写过的。因此目前心情十分复杂。但是考研失败也让我对工作机会更加珍惜,人只要尝过失败,短时间内就不想在尝第二次。我怀着“虽九死其犹未悔”的决心。在明天面试到来之际,做一下挣扎。真的,只有尽了最后一份力,才能在最后结果出来后坦然的说:“也就这样吧,我尽力了。”复习的内容主要有(由上往下重点降低)数据结构数据库操作系统(没学过)计算机网络...
2019-12-27 14:05:01
206
原创 游戏编程模式之单例模式
“确保一个类只有一个实例,并为其提供一个全局访问入口。”(摘自《游戏编程模式》)单例的设计对象本身就不应该拥有多个实例,或如果拥有就不能正常运行。适合使用单例模式的例子有:文件封装类(同一个文件的读与写操作不能同时发生)、日志记录、文件加载、游戏状态存储等单例模式提供了一个单一的实例、提供了全局获取位移实例的方法,这是该模式的重要特性。单例模式是一个双刃剑,我们使用时要保持清醒的头脑...
2019-03-22 23:47:15
268
原创 四种常见游戏循环实现方式
最基本的游戏循环bool game_is_running = true;while(game_is_running){ update_game()执行; display_game();}问题在于上述简单循环没有时间处理部分。关于游戏循环事件的术语:FPS:FPS是Frames Per Second的缩写。在上述实现的上下文中,它是每秒调用display_...
2019-03-22 13:36:21
4060
原创 游戏编程模式之原型模式
“使用特定原型实例来创建特定种类的对象,并通过拷贝原型来创建新的对象”(摘自《游戏编程模式》)原型:同属于某一父类的各种类拷贝:同一种类或统一父类的子类实例的初始化可以利用统一的生成器来生成实例实例:生成敌人在例子中,我们需要在游戏中生成三种敌人。他们分别书幽灵、恶魔、术士。最白痴的做法:平行化的类层次结构class Monster{ //……};//三类恶魔...
2019-03-21 14:56:55
229
原创 游戏循环
1. 游戏循环概念概念:整个游戏的核心流程控制。每迭代一次游戏循环称为1帧。游戏循环(主干):处理输入是一个广义的,而不仅仅只是人体工学输入。输入是游戏所数据的集合。更新游戏世界:动态的主要手段,例如渲染循环*(render loop)也需要Update Date。生成输出:渲染成2D或3D图形、输出音频等*渲染循环:实时计算机图形中,摄像机在三维场景中移动是,屏幕...
2019-03-20 19:21:14
1407
原创 游戏编程模式之观察者模式
“在对象间定义一种一对多的依赖关系,以便当某对象的状态改变时,与它存在依赖关系的所有对象都能收到通知并自动进行更新”(摘自《游戏编程模式》)MVC的底层就是观察者模式观察者模式理解图两者是m : n的关系。被观察者可以被多个观察监视,一个观察者可以观察多个被观察者观察者模式的意义是:把游戏逻辑从分散在各个主干代码上聚起来。实现方法主要思想是:利用关键字作为事件标志建立一个消...
2019-03-20 10:56:14
261
原创 游戏编程模式之享元模式
“使用共享以高效地支持大量的细粒度对象”(摘自《游戏编程模式》第三章)从这一句话可以看出,享元模式重要的目的是关于代码的高效性。而一般提升效率的本质则是减小计算量、工作量。例如:LOD:层次细节技术,它降低远处的渲染质量来减小计算机的工作量比较的二分法:利用规律减少比较次数理解上述问题是比较简单的。而享元模式,它减小计算量的手段是:通过对一个集合的公共部分的抽离,让公共部分共...
2019-03-19 13:46:15
316
原创 游戏编程模式之命令模式
命令就是一个对象化(实例化)的方法调用(摘自《游戏编程模式》)上述引用是将命令模式概念进行精简的版本,未精简的概念为:命令模式就是"将一个请求(request)封装成一个对象,从而允许你使用不同的请求、队列或日志将客户端参数化,同时支持请求操作的撤销与恢复" 。(你大概也不想理解这一句)这两个概念与“回调(callback)”具有共性。回调函数就是一个通过函数指针调用的函数。如果...
2019-03-19 13:44:19
378
原创 游戏开发中的数学基础
源自《3D游戏编程大师技巧(上册)》的总结坐标系表示物体的相对位置信息(相对原点),主要分为以下几种:2D坐标系:2D 笛卡尔坐标系。主要运用有序数对来表示点的位置信息2D 极坐标:方向和距离来定义点笛卡尔和极坐标之间的转换。 极坐标 to 笛卡尔 x = rcos(θ) y = rsin(θ) 笛卡尔 to 极坐标 r = sqrt(x^2+y...
2019-03-18 15:24:05
10596
1
原创 C#之托管与非托管
资源:在本地化中,资源用于翻译文本和图像。在这里,资源用于另一个主题:使用托管和非托管的资源——存储在托管或本机堆中的对象。后台内存管理值数据类型 在任何复杂的高级语言中,编译器负责把人们可以理解的变量名转化为处理器可以理解的内存地址在处理器的虚拟内存中,有一个区域成为栈。栈存储不是成员对象的值数据类型首先声明变量a,接着在内部代码块声明了b。然后内部代码块终止,b就超出作...
2018-06-02 12:31:58
3615
原创 C#学习之继承
基本概念 面向对象的三个特性:继承、封装、多态继承继承的类型:单重继承、多重继承、多层继承(C#不支持类的多重继承,但允接口的多重继承)、接口继承实现继承 //类 class child : MyBaseClass class child : MyBaseClass,Interface1,Interface2 //接口(只能用于继承接口) public stru...
2018-06-02 12:30:18
181
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人