在实体组件系统中应该如何处理设置代码?
How should setup code be handled in entity-component-system?
我正在 Python 中编写一个 ECS 框架和一个游戏。在 ECS 框架中,组件应该只包含数据。但是,有时需要设置代码来创建数据。例如,在音频组件中,数据将是要播放的声音的音量和音频文件的路径。但是在音频播放库中,有表示声音的对象,例如有一个 sound.play()
方法。我的问题是这个对象是否应该在组件中创建,这有点违反实体应该是纯数据的规则,或者在系统中。如果它最好在系统中完成,则只需完成一次(如果音频文件需要每帧创建一次,则会损害性能)。执行此操作的最佳方法是什么?
My question is whether this object should be created in the component, which sort of violates the rule that entities should be pure data, or in the system. If it should best be done in a system, it would only need to be done once (and it would harm performance if the audio file needed to be created once per frame). What is the best way to do this?
当您对实体系统使用 outboard 模型时,我认为要确定的最重要任务之一是实体和组件生命周期管理。没有它,编写不开始像意大利面条的系统代码真的很困难。
有些实现是他们希望您构建实体、构建其组件列表,然后激活实体。一旦实体被激活,就不能添加或删除组件,只能更改组件的属性值。为了 add/remove 个组件,您停用实体,进行更改,然后重新激活它。
假设我们使用这个实体生命周期过程。
当带有音频组件的实体被激活时,通知音频系统,从音频组件中读取属性,最后创建音频框架的声音对象。然后系统将负责维护组件和声音对象之间的簿记映射。这个内部映射是系统将使用每个帧来执行其更新的内容。
当具有音频组件的实体被停用时,音频系统会收到通知,销毁内部簿记映射中与该组件关联的音频框架的声音对象,然后从内部映射中删除条目。
我正在 Python 中编写一个 ECS 框架和一个游戏。在 ECS 框架中,组件应该只包含数据。但是,有时需要设置代码来创建数据。例如,在音频组件中,数据将是要播放的声音的音量和音频文件的路径。但是在音频播放库中,有表示声音的对象,例如有一个 sound.play()
方法。我的问题是这个对象是否应该在组件中创建,这有点违反实体应该是纯数据的规则,或者在系统中。如果它最好在系统中完成,则只需完成一次(如果音频文件需要每帧创建一次,则会损害性能)。执行此操作的最佳方法是什么?
My question is whether this object should be created in the component, which sort of violates the rule that entities should be pure data, or in the system. If it should best be done in a system, it would only need to be done once (and it would harm performance if the audio file needed to be created once per frame). What is the best way to do this?
当您对实体系统使用 outboard 模型时,我认为要确定的最重要任务之一是实体和组件生命周期管理。没有它,编写不开始像意大利面条的系统代码真的很困难。
有些实现是他们希望您构建实体、构建其组件列表,然后激活实体。一旦实体被激活,就不能添加或删除组件,只能更改组件的属性值。为了 add/remove 个组件,您停用实体,进行更改,然后重新激活它。
假设我们使用这个实体生命周期过程。
当带有音频组件的实体被激活时,通知音频系统,从音频组件中读取属性,最后创建音频框架的声音对象。然后系统将负责维护组件和声音对象之间的簿记映射。这个内部映射是系统将使用每个帧来执行其更新的内容。
当具有音频组件的实体被停用时,音频系统会收到通知,销毁内部簿记映射中与该组件关联的音频框架的声音对象,然后从内部映射中删除条目。