【问题标题】:How should setup code be handled in entity-component-system?在实体组件系统中应该如何处理设置代码?
【发布时间】:2019-09-13 01:35:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    那里有一些实现,他们希望您构建实体,构建其组件列表,然后激活实体。一旦实体被激活,就不能添加或删除组件,只能更改组件的属性值。为了添加/删除组件,您需要停用实体,进行更改,然后重新激活它。

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

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

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

    【讨论】:

    • 这是否也不能以允许从实体中添加和删除组件的方式实现,通过在其组件列表更改时自动“激活”和“停用”实体,从而自动通知系统的变化?
    • 当然,但是对于不经常在框架之间更改的实体,有一个用例是创建实体,添加其所有组件,然后在整个系统中执行单个激活以表示实体。这比为该实体调用每个系统 N 次组件时间快得多。
    猜你喜欢
    • 2017-05-28
    • 1970-01-01
    • 2012-12-03
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2012-01-14
    相关资源
    最近更新 更多