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


    运行在VS2022,x86,Debug下。

    30. 外观模式

    在这里插入图片描述

    • 为子系统定义一组统一的接口,这个高级接口会让子系统更容易被使用。
    • 应用:如在游戏开发中,游戏引擎包含多个子系统,如物理、渲染、粒子、UI、音频等。可以使用外观模式来封装这些复杂的子系统,提供一个简单的接口给游戏开发者,从而无需直接操作复杂的子系统,简化了开发流程。
    • 实现
      • 子系统。
      • 外观,提供统一的接口。
      • 客户端。
    • 代码如下。
      • 游戏引擎外观(GameEngineFacade类)使用单例模式,确保在整个游戏中只有一个外观实例,从而统一管理子系统资源。
    // 物理引擎子系统
    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注册的外观实例的析构函数,将三个子系统资源释放。

    在这里插入图片描述

  • 相关阅读:
    HTML5期末大作业:HTML+CSS茶叶官网网页设计实例 企业网站制作
    双机调试环境搭建 windbg + virtualkd 已完成未发布
    centos7 环境安装 PM2 管理 node
    苹果Audio Classifier使用问题
    「设计模式」六大原则之开闭职责小结
    网络社区挖掘-图论部分的基本知识笔记
    deque容器使用及评委打分系统
    C语言典范编程
    低代码平台
    GNSS模块如何应用在“监控案例”中
  • 原文地址:https://blog.csdn.net/qq_42692132/article/details/139414890