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

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

码农世界 2024-06-17 后端 82 次浏览 0个评论

运行在VS2022,x86,Debug下。

30. 外观模式

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

  • 为子系统定义一组统一的接口,这个高级接口会让子系统更容易被使用。
  • 应用:如在游戏开发中,游戏引擎包含多个子系统,如物理、渲染、粒子、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..." < 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()注册实例的析构函数。如下图。

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

          • 执行完构造函数,创建了三个子系统,如下图。

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

            • main()返回,如下图。

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

              • _exit()执行析构函数或atexit注册的函数指针,最后结束程序,如下图。

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

                • 执行atexit注册的外观实例的析构函数,将三个子系统资源释放。

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

转载请注明来自码农世界,本文标题:《C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,82人围观)参与讨论

还没有评论,来说两句吧...

Top