我正在创建一个基于组件的游戏对象系统。一些技巧:
GameObject只是一个列表Components。- 有
GameSubsystems。例如,渲染、物理等。每个都GameSubsystem包含指向某些Components.GameSubsystem是一个非常强大和灵活的抽象:它代表游戏世界的任何部分(或方面)。
需要一种注册机制Components(GameSubsystems何时GameObject创建和组合)。有4种方法:
- 1:责任链模式。每一个
Component都提供给每一个GameSubsystem。GameSubsystem决定Components注册哪个(以及如何组织它们)。例如,GameSubsystemRender 可以注册 Renderable Components。
亲。Components对它们的使用方式一无所知。低耦合。A.我们可以添加新的GameSubsystem. 例如,让我们添加注册所有 ComponentTitle 并保证每个标题都是唯一的 GameSubsystemTitles,并提供按标题查询对象的接口。当然,在这种情况下不应重写或继承 ComponentTitle。B.我们可以重组现有的GameSubsystems. 例如,GameSubsystemAudio、GameSubsystemRender、GameSubsystemParticleEmmiter 可以合并到 GameSubsystemSpatial 中(将所有音频、发射器、渲染Components放在同一层次结构中并使用父相对变换)。
反对。每次检查。非常低效。
反对。Subsystems知道Components。
- 2:每个
Subsystem搜索Components的特定类型。
亲。性能优于Approach 1.
反对。Subsystems还是知道的Components。
- 3:
Component在GameSubsystem(s). 我们在编译时知道有一个 GameSubsystemRenderer,所以让我们 ComponentImageRender 将调用类似 GameSubsystemRenderer::register(ComponentRenderBase*) 的东西。
观察者模式。Component订阅“更新”事件(由 发送GameSubsystem(s))。
亲。表现。没有不必要的检查,如Approach 1和Approach 2。
反对。Components与GameSubsystems.
- 4:中介模式。
GameState(包含GameSubsystems)可以实现 registerComponent(Component*)。
亲。Components并且GameSubystems对彼此一无所知。
反对。在 C++ 中,它看起来像丑陋而缓慢的 typeid-switch。
问题:
哪种方法更好并且主要用于基于组件的设计?实践说什么?关于(数据驱动)实施的任何建议Approach 4?
谢谢你。