在 Erlang 中实现组件实体系统甚至可能吗?

Is a Component Entity System implemented in Erlang even possible?

这两天学习了很多关于Erlang的知识,熟悉了组件实体系统。

对于 Erlang 以流程为中心的方法,我建议每个实体都是一个 Erlang 流程实例。至于 CES(组件实体系统)方法,对于拥有 MovementComponent 的实体(例如),我会有一个类似 "MovementSystem" 的过程。然后我会对所有已注册的实体进行尾递归 "iterate" 并向它们发送消息以让它们更新自己的进程状态,而不是像 MovementSystem 本身那样进行批处理......(我当时不会这样做不再调用实体系统,因为在我的理解中,CES 拥有它正在处理的所有实体和组件的所有信息,这意味着 "shared memory",从概念上讲,它不是 Erlang 的一部分)

这两个 approaches/paradigms - Erlang 和 "Component Entity System" - 互相排斥,还是我遗漏了什么?

(我什至不会将 GitHub (https://gist.github.com/sntran/2986790) 上的这个原型称为真正的组件实体系统。这种方法看起来更像是实体系统,在我看来它更像是基于 gen_event 的 MQ 方法,对此我可能会使用 RabbitMQ 来代替...但这与此处无关...)

现在我不明白这两个概念怎么可能结合起来...

我不了解 CES,但我确实认为您遗漏了一些东西。

each entity would be an Erlang process instance ... let them update their own process state rather than doing that as batch-processing by the MovementSystem itself ... which would mean "shared memory", which is by concept not part of Erlang

听起来好像您想将所有状态保存在一个地方。最简单的方法是使用一个进程并让该进程保持自己的状态。但是,还有其他方法:您可以拥有一个每个人都可以与之交谈的 "global state" 进程。您可以将 ETS 视为这方面的示例。将共享状态放在单独的进程中会使同步变得更加容易。

如果你想进行并行处理,有很多方法可以安排你的代码:你可以为所有 MovementComponents 使用 MovementSystem gen_server:cast 并让它们处理事情。如果一个实体的不同组件交互并且您需要知道是否有东西试图同时移动和说话,这可能最有效。如果组件更加独立,您可能只想生成一次性作业来处理移动。最后,可能 运行 所有串行移动代码都很便宜,您只需要每个系统一个进程。

好的,我做了进一步的研究...

-> This answer to another question to erlang 向我很好地解释了它

One thing Erlang isn't really good at: processing big blocks of data.

CES 本质上一次处理大量数据...

所以,我的答案是 "Yes, it is possible, but not a pretty good choice"...