每个模拟对象一个参与者,或者一个管理参与者



我正在开发一个模拟,它将具有许多实体不断更新,可能每秒30次。让我们假设我们有1000个实体,每个实体都有一个速度,因此每隔一秒就必须更新一个位置。

那么,如何使用actor模型实现这个呢?我不一定在这个项目中使用Erlang,但是为了讨论的缘故,我们就说我在使用Erlang吧。你会为每一个实体设置一个参与者吗?或者您是否需要一个"经理"角色来维护和更新这些实体的列表?

Learn You Some Erlang说:

的确,Erlang进程非常轻:您可以有数百个进程成千上万的人同时存在,但这并不意味着你必须这样使用它,因为你可以。例如,创造一款包括子弹在内的一切都属于自己的射击游戏演员是疯子。在这种游戏中,你唯一会射击的是你自己的脚。从…发送消息仍然有一点费用一个角色对一个角色,如果你把任务划分得太多,你就会制造问题慢!

所以这似乎表明管理者会更好。还是有我没看到的第三种选择?

你说得对!没有一个唯一的好的解决办法。

现在为了更有帮助,根据我所拥有的一些背景,我认为你应该看看你的项目的这些方面:

你说模拟。如果您需要每隔30毫秒刷新一次实体集合,首先要简化操作和数据模型,然后再考虑如何有效地遍历数据集合。

另一方面,如果你有一个庞大的和/或不断发展的对象集合,使用琐碎的算法/数据模型,那么考虑比列表更智能的数据结构,注意数据复制…

如果您使用多核(或集群),那么考虑将您的实体分组在几个超级实体中,以便利用并行性,在单独的进程中管理它们。

接下来想想这些组是否可以帮助你减少评估的次数(有一个自适应的时间片?)需求评估?…).

最后,我认为一般来说,Erlang紧凑且易于重构,因此可以利用这一点定义一些函数步骤,对于每个步骤,

让他们工作,让他们正确,让他们快速(肯特·贝克?)

对于最后一步,您可以从分析工具中获得一些帮助,例如fproof

勇气:o)

我认为Learn You Some Erlang在这里犯了一个过早的优化错误。您应该使用对您最有意义的抽象,度量任何问题,并在必要时进行重构。就我个人而言,我认为将每个粒子建模为自己的actor是最容易处理的,也是actor模型最惯用的方法。然而,实际上,你应该做任何你想做的事。

相关内容

最新更新