当前位置:   article > 正文

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

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

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

  • 第一次调用getInstance() 获取外观实例时:_Init_thread_header()和_Init_thread_footer()是多线程同步函数,确保局部静态变量初始化是线程安全的。GameEngineFacade()构造函数来创建实例,_atexit()注册实例的析构函数。如下图。

在这里插入图片描述

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

在这里插入图片描述

  • main()返回,如下图。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/686501
推荐阅读
相关标签
  

闽ICP备14008679号