当前位置: 代码网 > it编程>编程语言>C/C++ > C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

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

2024年08月03日 C/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();
}

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

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

在这里插入图片描述

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

在这里插入图片描述

  • main()返回,如下图。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com