Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实体组件系统中应如何处理设置代码?_Python_Design Patterns_Components_Entity_Entity Component System - Fatal编程技术网

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

Python 实体组件系统中应如何处理设置代码?,python,design-patterns,components,entity,entity-component-system,Python,Design Patterns,Components,Entity,Entity Component System,我正在用Python编写一个ECS框架和一个游戏。在ECS框架中,组件应该只包含数据。但是,有时需要设置代码来创建数据。例如,在音频组件中,数据将是要播放的声音的音量和音频文件的路径。但是在音频播放库中,有一些对象表示声音,例如,它们有一个sound.play()方法。我的问题是这个对象是否应该在组件中创建,这违反了实体应该是纯数据的规则,还是在系统中创建。如果最好在系统中进行,则只需进行一次(如果音频文件需要每帧创建一次,则会损害性能)。最好的方法是什么 我的问题是这个对象是否应该在组件中创建

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

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

当您将外部模型用于实体系统时,我认为需要确定的最重要任务之一是实体和组件生命周期管理。没有它,就很难编写出与意大利面条不同的系统代码

有些实现希望您构建实体,构建其组件列表,然后激活实体。激活实体后,不能添加或删除组件,只能更改组件的属性值。要添加/删除零部件,请停用实体,进行更改,然后重新激活它

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

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


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

这是否也可以通过允许在实体的组件列表发生更改时自动“激活”和“停用”实体,从而自动向系统通知更改的方式来实现,但对于不经常在不同帧之间更改的实体,有一个用例用于创建实体,添加其所有组件,然后在系统中为所述实体执行单个激活。这远远快于为该实体调用每个系统N次组件。