C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

运行在VS2022,x86,Debug下。

30. 外观模式

  • 为子系统定义一组统一的接口,这个高级接口会让子系统更容易被使用。
  • 应用:如在游戏开发中,游戏引擎包含多个子系统,如物理、渲染、粒子、UI、音频等。可以使用外观模式来封装这些复杂的子系统,提供一个简单的接口给游戏开发者,从而无需直接操作复杂的子系统,简化了开发流程。
  • 实现
    • 子系统。
    • 外观,提供统一的接口。
    • 客户端。
  • 代码如下。
    • 游戏引擎外观(GameEngineFacade类)使用单例模式,确保在整个游戏中只有一个外观实例,从而统一管理子系统资源。
cpp 复制代码
// 物理引擎子系统
class PhysicsSystem
{
public:
    void init() { cout << "Initializing physics engine..." << endl;}
    void update() { cout << "Updating physics..." << endl; }
};

//渲染子系统
class GraphicsSystem
{
public:
    void init() { cout << "Initializing graphics..." <<endl; }
    void render() { cout << "Rendering graphics..." << endl;}
};

//粒子子系统
class ParticleSystem
{
public:
    void init() { cout << "Initializing particle..." << endl; }
    void createParticle() { cout << "Creating particle..." << endl; }
};

//游戏引擎外观
class GameEngineFacade 
{
private:
    PhysicsSystem* physics;
    GraphicsSystem* graphics;
    ParticleSystem* particle;

    GameEngineFacade() //私有构造函数
    {
        physics = new PhysicsSystem();
        graphics = new GraphicsSystem();
        particle = new ParticleSystem();
    }

    ~GameEngineFacade() //私有析构函数
    {
        if (physics)
        {
            delete physics;
            physics = nullptr;
        }

        if (graphics)
        {
            delete graphics;
            graphics = nullptr;
        }

        if (particle)
        {
            delete particle;
            particle = nullptr;
        }
    }

    GameEngineFacade(const GameEngineFacade&) = delete; //删除拷贝构造函数
    GameEngineFacade& operator=(const GameEngineFacade&) = delete; //删除赋值运算符
    GameEngineFacade(GameEngineFacade&&) = delete; //删除移动构造函数
    GameEngineFacade& operator=(GameEngineFacade&&) = delete; //删除移动赋值运算符

public:
    static GameEngineFacade* getInstance() //静态函数,获取实例
    {
        static GameEngineFacade instance; //局部静态变量,存储实例
        return &instance;
    }

    void initGame() {
        graphics->init();
        physics->init();
        particle->init();
    }

    void updateGame() {
        physics->update();
        particle->createParticle();
    }

    void renderGame() {
        graphics->render();
    }
};

int main()
{
    GameEngineFacade* gameEngine = GameEngineFacade::getInstance();
    gameEngine->initGame();
    gameEngine->updateGame();
}

反汇编分析,子系统资源创建到释放过程

  • 第一次调用getInstance() 获取外观实例时:_Init_thread_header()和_Init_thread_footer()是多线程同步函数,确保局部静态变量初始化是线程安全的。GameEngineFacade()构造函数来创建实例,_atexit()注册实例的析构函数。如下图。
  • 执行完构造函数,创建了三个子系统,如下图。
  • main()返回,如下图。
  • _exit()执行析构函数或atexit注册的函数指针,最后结束程序,如下图。
  • 执行atexit注册的外观实例的析构函数,将三个子系统资源释放。
相关推荐
小雉系统9 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
唐墨12313 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏13 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆18 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
老歌老听老掉牙18 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
笑容掩饰我的失落18 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black19 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791221 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
杯子不吃紫菜21 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式