今天正式开始编写我们的游戏引擎GDE-X。
对于一个游戏来说,我们可以把其认为是一个状态机——实际上游戏中不同画面、场景等的变化,就是一个有限状态机状态间的相互切换。
大致可以理解如下:
while(not exit)
{
switch( state )
{
case state1:
do_state1();
case state2:
do_state2();
....
}
}
再抽一层,其实就是每个状态有一个“入状态”和“出状态”
那么我们设计上只需要实现一个调度机制,可以针对当前状态,调度运行状态具体内容,并且在运行完毕之后调度其他状态即可。
我们定义一个枚举型GameStatus,这里存放所有游戏中要使用的状态。(具体到游戏中可能是 主菜单、系统设置、游戏、游戏结束、读取进度……甚至是游戏的各个具体画面)
这里我们只给出两个用于测试的状态,empty和test
针对于每一个状态,我们提供一个“功能类”,就是该状态下游戏应该具体运行的逻辑代码。我们将其称为StateMachineClass(状态机类)
抽出其共性建立StateMachineBase类 和 StateMachine接口。特性如下:
StateMachineBase :
1. 需要拿到游戏引擎实例(本引擎中渲染句柄、资源等都存储在引擎实例中)
2. 需要有方法调度游戏引擎执行下一个状态(出状态)
IStateMachine:
1. 需要提供本状态的功能入口。(就是调度到该状态的时候具体运行哪些代码)
参考代码如下:
细心的你可能会觉得RunNextStatus这个函数的实现很奇怪,别急,之后会解释。
然后我们需要来实现整个游戏引擎状态机的调度机制。
首先,我们要将“状态”和“功能类”绑定起来。这里使用C#的Dictionary
那么我使用m_StateHash[状态名]就可以拿到功能类的实例,然后这里抽出功能类的接口Run方法,就能在调度中得到功能类的代码入口了。
我们得提供一个整个游戏状态机的启动入口
提供一个记录当前游戏状态的变量
最后,我们的重头戏,如何在一个状态结束后,调度运行下一个状态?
我原先的实现是在GameEngine里添加一个静态方法NextStatus,然后在功能类结束的时候去运行GameEngine.NextStatus(xxx)。——这样会有一个悖论。。 游戏引擎调度运行功能类,功能类里又阻塞的调用了游戏引擎的静态方法。。。周而复始,DEBUG一下打开堆栈查看栏。。果然,不出所料,之前所有运行过“功能类”的全部都没有释放内存!这样下去用不了多久就会内存崩掉的。
那么如何让我们的程序能在功能类里不阻塞的调用游戏引擎类方法实现状态机调度呢?
—— 这就是刚才那段奇怪的代码。
CompositionTarget 对象可以根据每个帧回调来创建自定义动画
我们在功能类中为CompositionTarget 注册一个位于GameEngine内的方法,用于调度状态机。
然后在GameEngine内如此实现:
太NICE了,在调度下一帧的时候,原来的堆栈已经释放,非阻塞的实现了GameEngine类方法的调用!
DEBUG,打开堆栈查看栏,非常爽的只有一层堆栈~
下面来使用我们的状态机!
编写两个功能类,其分别为主界面载入一张背景图片,并且等待两秒,跳到下一个状态。
这两个类需要继承自我们的功能类基类和接口类
看看结果 ——
背景切换相当成功。
堆栈记录相当赏心悦目。
内存使用情况十分稳定。
至此完成我们的游戏引擎状态机。
分享到:
相关推荐
1664 3/31/2021 11:09 jekyll new gde-jekyll 1665 3/31/2021 11:09 cd gde-jekyll 1666 3/31/2021 11:10 bundle exec jekyll serve $ bundle exec jekyll serve Configuration file: /home/knerr/repos/gde-...
学习matlab中的simulink的ppt,现在本人见过的最好的ppt,
GDE-FEM_1.0 MATLAB代码用于模拟经历凝结和凝结过程的气溶胶数量分布的时间演变。 近似方法应用了有限元方法。 提供了示例代码,说明如何使用这些功能来估计气溶胶数量分布: example_size_dist_evolution.m example...
海力士选型手册,最新产品,NAND FLASH,DDR
GDE_地理数据引擎的设计与实现 caj格式
ffmpeg
然后,引入GDE 3算法用于红外低轨星座设计,该方法基于Pareto最优概念,能够得到多个最优解,适于多目标优化设计.通过星座建模和目标函数设计,进行了仿真实验.最后验证了设计得到的星座在多项性能指标上均优于已...
海力士SK hynix原厂SSD固态硬盘管理工具及中文说明书(win32位),对海力士SSD硬盘提供以下功能: • SK hynix 和其他系统硬盘的识别与枚举 • 硬盘的详细信息,如容量、型号等。 • 有关硬盘运行状况的详细信息,...
GD32E230芯片数据手册,包括产品的简介,功能概要,引脚定义,内部功能部件,工频频率,工作环境,应用场合,内核介绍。
该程序用盖氏圆盘方法(GDE)计算均匀直线阵(ULA)中信号源个数估计性能随SNR的变化情况,采用Monte-Carlo模拟。
Magento2x-Ubuntu-Nginx 如何使用Nginx在Ubuntu上安装Magento 2.3x或2.4x。 开发环境: Magento 2.3x / 2.4x nginx/1.14.x PHP 7.2x -7.4x MySQL 5.7-8x Ubuntu 18.04-20.04 步骤1:安装服务器。 - cat /etc/...
使用盖氏圆法则估计信号源个数。 使用空间谱估计理论,模拟发射信号由天线阵列接受采样。经过盖氏圆算法,估计出采样序列中信号的个数,所加噪声可以为白噪声,也可以为色噪声
一种改进的GDE信源数估计方法,张朝柱,刘志丹,分析了盖尔圆准则在色噪声条件下进行信号源数目估计的原理。在盖尔圆准则的基础上,提出了一种有色噪声条件下的信源数目估计方法
图神经常微分方程(GDE)形式化为GNN的对等形式,其中输入-输出关系由GNN层的连续性决定,混合了离散的拓扑结构和微分方程。 所提出的框架显示出与各种静态和自回归GNN模型兼容。 结果证明了GDE的一般有效性:在...
STM32F10x系列移植到GD32E103系列1.0
GD32E103开发说明,demo程序
Learn of OpenGL, and it is run under GDE
电子纸显示屏 等审核人员审核完成后才能开通下载
版本:xtensa-lx106-elf-linux64-1.22.0-88-gde0bdc1-4.8.5
来自七年WMAP的宇宙微波背景辐射数据的最新观测数据,来自SDSS的重子声振荡数据,来自Union2的超新星Ia数据以及来自Chandra X的X射线气体质量分数数据的组合 最大的松弛星系团的X射线观测用于对BD宇宙学中的GDE进行...