当前位置: 首页 > news >正文

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注册的外观实例的析构函数,将三个子系统资源释放。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32F103C8移植uCOSIII并以不同周期点亮两个LED灯(HAL库方式)【uCOS】【STM32开发板】【STM32CubeMX】
  • 软件测试--第六章、系统功能测试
  • 自动化专业之半导体行业入门指南
  • Spring Boot通过自定义注解和Redis+Lua脚本实现接口限流
  • 牛客网刷题 | BC120 争夺前五名
  • TiDB-从0到1-配置篇
  • Linux下软件安装
  • 【ROS2大白话】四、ROS2非常简单的传参方式
  • 55.ReentrantReadWriteLock应用于缓存
  • Laravel学习-自定义辅助函数
  • LINUX网络FTP服务
  • Linux中网络配置项目笔记
  • 【Stable Diffusion】(基础篇二)—— Stable Diffusion图形界面介绍和基本使用流程
  • 自建 Docker 镜像
  • SpringBoot——整合WebSocket长连接
  • 自己简单写的 事件订阅机制
  • [译]CSS 居中(Center)方法大合集
  • 2017-08-04 前端日报
  • create-react-app项目添加less配置
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Git的一些常用操作
  • httpie使用详解
  • node-glob通配符
  • PHP 7 修改了什么呢 -- 2
  • PHP变量
  • Spring Boot MyBatis配置多种数据库
  • underscore源码剖析之整体架构
  • 编写符合Python风格的对象
  • 七牛云假注销小指南
  • 让你的分享飞起来——极光推出社会化分享组件
  • 深入浏览器事件循环的本质
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 再谈express与koa的对比
  • 正则表达式
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 回归生活:清理微信公众号
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​iOS安全加固方法及实现
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ![CDATA[ ]] 是什么东东
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (13)Hive调优——动态分区导致的小文件问题
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (多级缓存)多级缓存
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (四)汇编语言——简单程序
  • (算法)前K大的和
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)GCC在C语言中内嵌汇编 asm __volatile__