游戏引擎架构底层系统篇---1.子系统的加载与卸载

ByteHorizonMaster
• 阅读 1702

所有游戏引擎都需要底层系统的支持,来做一些平凡琐碎但是又必须要做的事情。如:加载和卸载子系统,配置引擎和游戏的特性,管理引擎的内存,对游戏中使用的各种资源的访问方式,游戏开发中的调试工具等。所以从现在开始,我们就来看一些游戏引擎中的底层系统并尝试实现他们吧。


子系统的加载和卸载

游戏引擎是一个由一大堆互相交互的系统所构成的,所以当引擎启动的时候,子系统必须要按照一种特定的顺序来进行配置和初始化(因为子系统之间存在一定的依赖性)。子系统之间的依赖性决定了这个特定的加载顺序。接下来我们就开始看看该如何解决这一问题。

C++

因为我们决定使用的语言是C++,所以我们先来考察一下C++的特性能否为我们解决这个加载顺序的问题。

在windows中,C++中的global和static类型的对象会在main()函数调用之前就构造完成,但是这些对象会以一种不可预测的顺序构造,与之相对应的析构函数会在main()结束后以一种不可预测的顺序调用。

class RenderManager
{
public:
    RenderManager() {
        //start up the manager
    }

    ~RenderManager() {
        //shut down the manager
    }
};
//singleton instance
static RenderManager gRenderManager;

所以global,static 不行


通过命令来构建

那既然直接用C++的特性解决不了问题,就只好绕个圈子。我们知道,一个在函数中的静态变量是不会在main()函数和它本身所在的函数调用之前构造的。所以我们可以通过在函数中申明静态变量来控制我们的全局单例。

来改进一下之前的代码吧!

class RenderManager
{
public:
    static RenderManager& get() {
        static RenderManager sSingleton;
        return sSingleton;
    }

    RenderManager() {
        //start up the manager
    }

    ~RenderManager() {
        //shut down the manager
    }
};

这一次可以了吗?如果我们能控制get()函数何时运行,那么就可以控制这个构造顺序了。
但是问题来了,怎么控制析构的顺序呢?并且很难精准预测到RenderManager何时被构造。

所以这种方式也不太行

一种简单的可以工作的方式

我们仍然坚持子系统的单例模式,那就可以直接粗暴的显式定义start-up和shut-down函数来加载每一个子系统单例,他们取代了构造函数和析构函数。
此时,我们就可以显式的的规定子模块在main()函数中何时被构造,何时被析构,从而做到以一定的顺序被加载和卸载。而构造函数和析构函数则什么都不做。

class RenderManager
{
public:
    RenderManager() {
        //do nothing
    }

    ~RenderManager() {
        //do nothing
    }

    void StartUp() {
        //start up the manager
    }

    void ShutDown() {
        //shut down the manager
    }
};
RenderManager gRenderManager;
PhysicsManager gPhysicsManager;
//...

int main(int argc, const char* argv) 
{
    gRenderManager.StartUp();
    //...
    gPhysicsManager.StartUp();

    //...

    gPhysicsManager.ShutDown();
    //...
    gRenderManager.ShutDown();

    return 0;
}
点赞
收藏
评论区
推荐文章
Chase620 Chase620
5年前
H5游戏开发:FC小蜜蜂 | Aotu.io「凹凸实验室」
H5游戏开发:FC小蜜蜂byTH(https://github.com/ONESUNDAY)on20180128使用Phaser游戏引擎开发,主要
Wesley13 Wesley13
4年前
Unity小王子私藏的开发2D游戏的常用插件合集
Unity以开发3D游戏见长,早期版本的Unity在开发2D游戏时不慎方便,因此AssetStore出现了很多2D游戏开发引擎。现在Unity对2D游戏的支持越来越好,而这些开发2D游戏的Unity插件也得到了更多开发者的喜爱。1:RexEngine:Classic2DPlatformerEngine(https://www.os
Stella981 Stella981
4年前
Scut开源游戏服务器引擎
Scut开源游戏服务器引擎简介Scut游戏服务器引擎使用C语言开发,特别适用于手机网络游戏,支持使用Python脚本进行游戏开发;支持MSSQL/Mysql数据库;支持HTTP/Socket协议同时接入;采用实体类对象建模,自动构造数据库表结构生成和修改语句;业务逻辑层使用C/Python脚本开发,提供了丰富的类库和API接口,极大降低了开
Stella981 Stella981
4年前
Cocos Creator基础教程(10)—预览调试
游戏预览是开发中的一个重要环节,CocosCreator游戏引擎基于JavaScript语言有着丰富强大的预览调试能力,这次我们介绍预览调试相关的技术,了解一下这方面的知识相信对你也非常有帮助。1\.游戏预览CocosCreator是跨平台的游戏开发引擎,从类别上主要分为Nativet和H5两大平台,游戏预览也分为这两大模式:
Stella981 Stella981
4年前
Protobuf在微信小游戏开发中的使用技巧
微信小游戏发布后,许多HTML5游戏开发者希望把现有的HTML5游戏迁移到微信小游戏中,但由于一些技术上的问题导致进程卡壳。通过梳理Egret社区、白鹭小游戏开发技术讨论群等途径的反馈后发现,有不少开发者遇到的难题在于「如何在微信小游戏中使用Protobuf」。白鹭引擎架构师王泽在近期发布了一个开源项目protobufegret,提供了一个可
Stella981 Stella981
4年前
FMOD Event System——事件树策略、加载、内存分配
FMOD最新API—EventSytem,提供了比FMODEx更高层的接口,使引擎开发人员无需关注诸如音频数据管理、播放控制、channels管理等底层细节,而把精力放在考虑如何为上层应用(如:场景/技能/UI编辑器中的音效、音乐的编辑,游戏中各种音效、音乐的播放)设计适合的框架。此外,它还提供了相应的设计工具—FMODDesigner,让音效制作人员
Stella981 Stella981
4年前
Scut游戏服务器引擎6.0.5.0发布:增加C#脚本支持
 更新说明:1\.增加C脚本支持2\.增加Pay和Sns中间件对Mysql数据库支持3\.精简布署步骤,取消Redis写入程序,将其移到游戏底层运行4\.修正Mysql对中文可能会出现乱码的BUG点击下载:Scut游戏服务器引擎6.0.5.0版本(https://www.oschina.net/action
流浪剑客 流浪剑客
2年前
Macos足球真实模拟游戏:fm足球经理Football Manager 2023 for mac
《》是一款由SportsInteractive开发的足球模拟经营类游戏。在游戏中,玩家将扮演一名足球俱乐部的经理,负责管理球队的日常训练、比赛安排、球员转会和人事管理等方面。游戏特色如下:新的比赛引擎:使比赛看起来更加真实,更具观赏性。最新数据库:包含所有
GeorgeGcs GeorgeGcs
8个月前
【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙游戏类应用(游戏一、前言LayaAir引擎是国内最强大的全平台引擎之一,当年H5小游戏火的时候,腾讯入股了腊鸭。我还在游戏公司的时候,17年曾经开发使用腊鸭的H5小游戏,很怀念当年和腊鸭同事一起解决问题的时光
ByteHorizonMaster
ByteHorizonMaster
Lv1
海边的夜景,美丽而又宁静,放松了人一天的好心情。
文章
6
粉丝
0
获赞
0