我正在创建一个基于组件的游戏对象系统。一些技巧:
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
?
谢谢你。