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注册的外观实例的析构函数,将三个子系统资源释放。
相关推荐
田里的水稻3 分钟前
C++_python_相互之间的包含调用方法
c++·chrome·python
sinat_286945198 分钟前
opencode
人工智能·算法·chatgpt
HABuo16 分钟前
【Linux进程(四)】进程切换&环境变量深入剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
工口发动机24 分钟前
ABC440DEF简要题解
c++·算法
带土131 分钟前
4. C++ static关键字
开发语言·c++
橘颂TA31 分钟前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁
C++ 老炮儿的技术栈38 分钟前
什么是通信规约
开发语言·数据结构·c++·windows·算法·安全·链表
天人合一peng44 分钟前
unity 3d 通过游戏对象的名子查到其对象
游戏·unity·游戏引擎
零小陈上(shouhou6668889)1 小时前
K-近邻算法 - lazy learning的代表
算法·近邻算法
有一个好名字1 小时前
力扣-从字符串中移除星号
java·算法·leetcode