游戏设计模式阅读笔记13——解耦模式(组件模式)

一、意图

         允许单一实体跨越多个领域而不会导致这些领域彼此耦合。

二、动机

         当一个系统涉及到渲染,物理,声音,控制器输入等等...如果都写在一个类中,这个类就显得巨大且不易维护添加,高度耦合。

        在使用并发的现代游戏中,为了让代码在多个线程上运行是至关重要的。将游戏分割为多线程的一种通用方法就是通过领域划分。在一个核上运行AI代码,在另一个上播放声音,在第三个上渲染等。

         最简单的优化:将每个领域单独写成类。这些类被称为组件类。系统可以有多个组件类,但是他们之间互不知道彼此的存在。

在如今的软件设计趋势是:尽可能使用组件代替继承。不是让两个类继承同一类来分享代码,而是让它们拥有同一个类的实例

三、组件模式详解

        1.适用场景

                1.需要分离一个涉及多个领域类的各个领域。

                2.一个类很庞大且难以使用

                3.想要定义一系列分享不同能力的类,但是使用继承无法让你精确选取要重用的部分。

        

组件模式通常可以增进性能和缓存一致性。 组件让使用数据局部性模式的CPU更容易组织数据。

        2.代码示例

        比如Bjorn类。在没有使用组件模式的时候,需要在Updata函数中实现所有领域的更新。

 

使用组件模式后:

在各个领域的类中实现updata的逻辑:

Bjorn类就变成了一个组件的集合,只需要自己去调用这几个类的updata函数就可以了。

         这里还有的优化是使用指针来代替内联的实例。比如输入系统的实例换成输入系统的指针,就可以在演示系统的时候接入一个电脑演示的输入类。

 

 3.对象如何获取组件

        1.对象创建组件

                i.保证对象总是可以拿到需要的组件

                ii.重新设置对象比较困难

        2.外部代码提供组件

                i.对象更加灵活

                ii.对象可以与具体的组件类型解耦。

4.组件之间如何通信

        1.通过修改容器对象的状态

                i.保持了组件的解耦

                ii.需要将组件分享的任何数据存储在容器类中

(这样会浪费内存,如果将渲染专用的数据放入容器对象中,任何隐形对象都会无益地消耗内存)

                iii.让组件的通信基于组件运行的顺序

        2.通过他们之间的相互引用

        让需要交流的组件相互引用,就可以直接交流,无需通过容器类。

                i.简单快捷

                ii.两个组件紧绑在一起

        3.通过发消息

        很复杂,会在容器类中建小小的消息系统,允许组件之间相互发送消息。

        它有一个简单的receive()方法,每个需要接受消息的组件类都要实现它。 这里,我们使用一个int来定义消息,但更完整的消息实现应该可以附加数据。

        然后,向容器类添加发送消息的方法。

 

        注意:这里发送的消息,如果本体也监听了这个消息,本体也会收到。小心造成死循环。

        i.同级组件解耦

        ii.容器类很简单

 

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中常用的解耦设计模式包括工厂模式、抽象工厂模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、观察者模式和命令模式等。这些设计模式的共同点是将程序的业务逻辑与实现细节分离,从而提高代码的可读性和可维护性,同时也方便了代码的重用和扩展。 其中,工厂模式和抽象工厂模式可以将对象的创建和使用分离,使得程序更加灵活;适配器模式可以将不兼容的接口转换为兼容的接口,使得不同的类可以协同工作;装饰者模式可以动态地为对象添加新的功能,而不需要修改原有的代码;代理模式可以为其他对象提供一个代理,从而控制对该对象的访问;外观模式可以为复杂的子系统提供一个简单的接口,使得客户端可以更加方便地使用该子系统;桥接模式可以将抽象部分和实现部分分离,从而使得它们可以独立地变化;组合模式可以将对象组合成树形结构,从而使得客户端可以像处理单个对象一样处理整个树形结构;享元模式可以共享对象,从而减少内存的使用;观察者模式可以将对象的状态和行为分离,从而使得对象可以更加灵活地响应变化;命令模式可以将请求封装成对象,从而使得请求可以被记录、撤销和重做。 下面是一个使用工厂模式的例子: ```c++ #include <iostream> using namespace std; // 抽象产品类 class Product { public: virtual void use() = 0; }; // 具体产品类A class ProductA : public Product { public: void use() { cout << "ProductA" << endl; } }; // 具体产品类B class ProductB : public Product { public: void use() { cout << "ProductB" << endl; } }; // 抽象工厂类 class Factory { public: virtual Product* createProduct() = 0; }; // 具体工厂类A class FactoryA : public Factory { public: Product* createProduct() { return new ProductA(); } }; // 具体工厂类B class FactoryB : public Factory { public: Product* createProduct() { return new ProductB(); } }; int main() { Factory* factory = new FactoryA(); Product* product = factory->createProduct(); product->use(); delete product; delete factory; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值