【问题标题】:Actor model and collision detection演员模型和碰撞检测
【发布时间】:2012-05-09 09:17:45
【问题描述】:

我只是在考虑 Erlang 用于游戏服务器的可能性。 (哦,我不是 Erlang 专家,只是考虑阶段)这意味着使用 Actor Model 进行游戏模拟。当然,最大的吸引力在于它的并发分布在多个节点上。

我目前最大的问题是我应该如何执行多角色交互,例如碰撞检测。 (这只是一个例子)

虽然在任何游戏中本质上都需要碰撞检测,但从 Actor 模型的本质来看,它看起来并不高效,甚至没有意义,因为它需要全局同步状态查询并更新所有目标 Actor。如果我使用任何同步,它会覆盖 Erlang 的 Actor 模型的所有优点。

当然,如果我正确使用空间分区,一次定位参与者可能会更小,但这只是一种优化,而不是主要答案。或者这是这个问题的正确答案?通过减少交互参与者的数量来缩小同步范围?

【问题讨论】:

    标签: erlang interaction actor-model


    【解决方案1】:

    将地图分割成更小的部分,让每个部分成为自己的进程(您甚至可以将地图分割得如此之多,以至于每个图块都是自己的进程)。试图移动的玩家将向图块/子地图发送一条消息,说明它正在前往那里,并且图块会回答是否可以。这避免了冲突,因为瓦片/子地图一次只处理一条消息。多个 sub-maps/tiles 可以同时处理消息,所以它仍然是一个并发程序。

    【讨论】:

    • 减少交互范围看起来是唯一的出路。谢谢。
    【解决方案2】:

    我有一个基于太空的游戏在 Erlang 中运行服务器。诀窍是每个位置/节点/等也是一个演员。它持续运行物理,并定期将信息发送给每个游戏实体 Actor。

    当您开始更抽象地思考演员/实体是什么时,整个事情就会变得更加清晰。例如,碰撞可以是成熟的演员。这使得客户端更容易——将图形和声音效果与碰撞联系起来。在服务器端,它也能起到同样的作用——在给定时间内防止两个实体之间发生多次碰撞。

    【讨论】:

    • 那么所有的物理都是在单个actor中完成的吗?你是如何完成物理的?
    • 是的。我正在使用 Bullet 来运行物理。实体演员跟踪他们自己的游戏状态,互相射击,决定运动等。他们向运行模拟的位置发送命令。该位置连续运行并定期向实体发送“你在这里”和“你与 X 发生碰撞”。实体也会向该位置发送查询。