设置代码应如何在实体组件系统中处理?

时间:2019-04-23 19:52:53

标签: python design-patterns components entity entity-component-system

我正在用Python编写ECS框架以及与此相关的游戏。在ECS框架中,组件应仅包含数据。但是,有时需要设置代码才能创建数据。例如,在音频组件中,数据将是要播放的声音的音量以及音频文件的路径。但是在音频播放库中,存在表示声音的对象,例如,它们具有sound.play()方法。我的问题是,是否应该在组件中创建该对象,哪种违反了实体应该是纯数据的规则,还是在系统中。如果最好在系统中完成,则只需执行一次(如果音频文件每帧需要创建一次,则会损害性能)。最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

  

我的问题是,是否应该在组件中创建该对象,这违反了实体应为纯数据的规则,还是在系统中。如果最好在系统中完成,则只需执行一次(如果音频文件每帧需要创建一次,则会损害性能)。最好的方法是什么?

当您将舷外模型用于实体系统时,我认为要确定的最重要的任务之一是实体和组件生命周期管理。没有它,编写与意大利面条不太相似的系统代码将变得非常困难。

有一些实现,他们期望您构造实体,构建其组件列表然后激活该实体。激活实体后,您将无法添加或删除组件,而只能更改组件的属性值。为了添加/删除组件,您可以停用实体,进行更改,然后重新激活。

让我们假设我们使用这个实体生命周期过程。

激活带有音频组件的实体时,将通知音频系统,从音频组件读取属性,最后创建音频框架的声音对象。然后,由系统负责在组件和声音对象之间维护簿记图。该内部映射是系统将使用每个帧执行其更新的内容。

停用具有音频组件的实体时,会通知音频系统,销毁内部簿记图中与该组件关联的音频框架的声音对象,然后从内部图中删除条目。