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注册的外观实例的析构函数,将三个子系统资源释放。
相关推荐
浅念同学4 小时前
算法-常见数据结构设计
java·数据结构·算法
Java资深爱好者4 小时前
如何在std::map中查找元素
开发语言·c++
UndefindX4 小时前
PAT甲级1006 :Sign In and Sign Out
数据结构·算法
T风呤7 小时前
学生管理系统(通过顺序表,获取连续堆区空间实现)
算法
安步当歌7 小时前
【FFmpeg】av_write_trailer函数
c语言·c++·ffmpeg·视频编解码·video-codec
广州千汇凡网络科技有限公司8 小时前
撸包广告小游戏app开发对接广告联盟
游戏·团队开发·游戏策划
stackY、8 小时前
【Linux】:程序地址空间
linux·算法
客院载论8 小时前
秋招突击——7/5——复习{}——新作{跳跃游戏II、划分字母区间、数组中的第K个大的元素(模板题,重要)、前K个高频元素}
游戏
心死翼未伤8 小时前
【MySQL基础篇】多表查询
android·数据结构·数据库·mysql·算法
青青草原上的梦想家8 小时前
Cocos Creator 游戏性能优化指南
游戏·面试·性能优化·typescript