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注册的外观实例的析构函数,将三个子系统资源释放。
相关推荐
wusixuan13100429 分钟前
最大闭合子图学习笔记 / P2805 [NOI2009] 植物大战僵尸
笔记·学习·算法·最大闭合子图
孟大本事要学习1 小时前
算法第15天:继续二叉树|前序递归+回溯与前序递归的场景总结、最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树
算法
GalaxyPokemon2 小时前
LeetCode - 76. 最小覆盖子串
运维·服务器·数据结构·算法·leetcode
嵌入式@秋刀鱼2 小时前
《 第三章-招式初成》 C++修炼生涯笔记(基础篇)程序流程结构
linux·开发语言·数据结构·c++·笔记·visual studio code
HaiQinyanAN2 小时前
【学习笔记】重载和重写的注意事项
c++·笔记·学习
手握风云-2 小时前
动态规划算法的欢乐密码(二):路径问题
算法·动态规划
西北大程序猿3 小时前
服务器代码知识点补充
服务器·开发语言·网络·c++·网络协议
Raven100863 小时前
L1G2-OpenCompass 评测书生大模型实践
算法
NAGNIP3 小时前
RAG信息检索-如何让模型找到‘对的知识’
算法
打不了嗝 ᥬ᭄4 小时前
进程控制
linux·运维·服务器·c++