2021SC@SDUSC
本次博客开始我将正式深入源码进行分析与学习。
首先我们聚焦到FlaxEngine的engine,它是为整个引擎提供资源整合以及系统支援的代码部分,我们进入到GitHub的对应页面,可以看到如下图的文件目录:
可见全部为C、C++、C#语言。我们对文件做适当分类:
1.全局变量相关:可以看到全局变量定义了引擎用到的对系统整体起作用的变量
1)Folder
StartupFolder | 启动文件夹 |
TemporaryFolder | 临时文件夹 |
ProjectFolder | 项目文件夹 |
ProductLocalFolder | 本地文件夹 |
BinariesFolder | 二进制流文件夹 |
ProjectCacheFolder | 项目缓存文件夹 |
EngineContentFolder | 引擎内容文件夹 |
ProjectSourceFolder | 项目源代码文件夹 |
2)其他
FatalErrorOccurred | 是否发生错误 |
IsRequestingExit | 是否请求退出 |
ExitCode | 退出码 |
MainThreadID | 主线程序号 |
先对这些全局变量心中有数,便可使代码阅读更为通顺。
2.通过名字可知是引擎基础代码以及相应的服务类
先来看看EngineImpl即引擎实现的命名空间 ,I
IsReady 判断游戏引擎是否准备完毕;
RunInBackground 判断背景是否运行;
CommandLine 命令行;
Fps及FpsAccmulatedFrames 帧数的变量;
同时定义三个方法:
InitLog()、InitPaths()、InitMainWindow(),从名字可以看出是对日志、路径、窗口的初始化。
令人欣慰的是,接下来我们就看到了熟悉的名词:update、FixedUpdate、LateUpdate(游戏运行时的每帧调用函数及晚更新函数,具体的区别可参考:Unity中Update,FixedUpdate,LateUpdate的区别 - 南山砍柴 - 博客园 (cnblogs.com))、Pause(停止函数)等,可以看出这部分内容关键在于定义引擎中的一些惯用动作,并且会在未来实现,以此体现游戏引擎封装性的特点。
接下来我们看到Main函数的参数时cmdLine的指针,并将其赋值给EngineImpl命名空间的命令行,以此达到对命令行内容的传递,同时调用平台部分的GetCurrentThreadID()(显然是获取当前线程序号的函数)来定义主线程序号,并赋值启动时间。
两个if判断:命令行语法是否出错;
平台是否初始化成功;
设置启动文件夹
加载游戏信息和项目信息,我们可以看到之前命名空间的初始化函数。
编辑器信息初始化,首先确认项目是否升级
接着我们专注于更加具体的初始化逻辑,可以看到这里Flax用时间类中的函数去定义刷新频率(Tick:刷新频率)。 timeToTick为刷新频率,GetNextTick为下一次刷新时间,GetTimeSeconds为据上一次刷新过去的时间,所以剩余刷新时间为GetNextTick()-GetTimeSeconds()。
此处是平台应用程序的停止逻辑,停止后进行一个do-while循环,若仍停止且未退出,则重复平台的刷新及睡眠时间;若应该退出,则直接退出函数体。这个函数的结构很类似生产者和消费者问题的解决模式,即wait()和signal()。
到此,基本上就是FlaxEngine引擎启动时的基本信息初始化,其中依然涉及很多别的模块的具体函数,我们之后再具体分析,同时,仍有一些相关函数内容的初始化未涉及,在下一篇博客中我们将聚焦于那一部分。