0

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

那么,您将如何使用演员模型来实现这一点?我不一定在这个项目中使用 Erlang,但为了争论,我们就说我是。你会为这些实体中的每一个都有一个演员吗?或者你会有一个“经理”演员来维护和更新这些实体的列表吗?

向你学习一些 Erlang 说

诚然,Erlang 进程非常轻量级:你可以同时存在数十万个进程,但这并不意味着你必须这样使用它,因为你可以。例如,创建一个射击游戏,其中包括子弹在内的所有东西都是它自己的演员,这很疯狂。在这样的游戏中,你唯一能射击的就是你自己的脚。从actor到actor发送消息仍然有很小的成本,如果你将任务划分得太多,你会让事情变得更慢!

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

4

2 回答 2

0

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

于 2013-03-07T01:06:48.237 回答
0

你说!没有一个好的解决方案。

现在为了更有帮助,并且我的背景很少,我认为你应该看看你的项目的这些方面:

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

另一方面,如果您有一个庞大和/或不断发展的对象集合,具有简单的算法/数据模型,那么请查看比列表更智能的数据结构,注意数据副本......

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

接下来想想这些组是否可以帮助您减少评估次数(有自适应时间片?按需评估?...)。

最后,我认为 Erlang 比一般来说更紧凑且易于重构,因此利用这一点定义一些功能步骤,并为每个步骤,

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

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

勇气:o)

于 2013-03-04T19:18:56.283 回答