【问题标题】:How are massive cellular automata simulated?大规模元胞自动机是如何模拟的?
【发布时间】:2012-05-04 21:52:22
【问题描述】:

以 Minecraft 中的红石为例 - 它基本上是一个具有以下基本规则的 15 状态元胞自动机:

Redstone -> Redstone, powered of level Max(neighbours)-1

以及各种连接元素的附加规则

Repeater, inactive -> Repeater, active, level 2 if its input is powered
Repeater, active, level 2 -> Repeater, active, level 1
Repeater, active, level 1 -> Repeater, inactive
Redstone, unpowered -> Redstone, powered if there is a neighbouring Repeater, level 1 or another source

(我已经写了更多关于如何使用 CA 实现 Minecraft 的内容:http://madflame991.blogspot.com/2011/10/cellular-automata-in-minecraft.html

现在,我的问题是:游戏将如何更新巨大的红石装置?它使用什么数据结构?它真的是作为元胞自动机实现的吗?如果不是,那么您的最佳猜测是什么?

附:我并不是要任何人看一看实际的源代码,而只是想推测一下这个技术是如何实现的。 ...我在这里发布这个,在 SO 上,而不是在 gamedev 上,因为这是一个 CA 问题,而不是一个与 gamedev 相关的问题。

【问题讨论】:

  • 那是你的一篇很酷的博文。我特别喜欢玩光照模拟器并看到变化通过矩阵传播。

标签: algorithm cellular-automata


【解决方案1】:

执行此操作的明显方法是将世界划分为块(嘿,我的世界已经这样做了!)并将每个块分配给服务器。每个服务器负责处理对该块的更新,并负责与负责相邻块的服务器通信,向它们传播状态。

在像这样的元胞自动机的情况下,每个块必须将其边缘单元的当前状态传达给所有相邻的块,反之亦然,然后才能增加时间步长。请注意,通信开销随着块的增大而减小,因为块区域随着 O(n^2) 的增长而增长,而周长仅随着 O(n) 的增长而增长。

实际上,我怀疑你会发现它并没有那么同步,并且每个块都异步模拟其中的红石,仅在事件发生时将更新传输到相邻块,并且不会尝试与其他所有人保持同步.

【讨论】:

  • 我更倾向于相信,当红石电路的任何元素改变状态时,Minecraft 只会将更改传播给直接邻居,而不考虑区块边界。
  • @Li-aungYip 当然,你是对的 - 我一直在思考这个虚构的分布式 Minecraft 客户端。不过,我怀疑我认为它是异步的仍然是正确的。
  • 实际上(原版)红石被有效地“分块”,因为在您需要中继器之前需要 15 个方块的传播距离。这限制了任何滴答中需要完成的工作量。
【解决方案2】:

模拟mind-boggingly massive cellular automata(例如Game of Life in Game of Life)的另一种可能方法是检测模式(滑翔机、滑翔机发电机等)并预测它们未来的演变,并且只计算未知的部分(滑翔机演变)。

【讨论】:

    【解决方案3】:

    Hashlife (1) 可以通过在非常大的空间上加速计算来满足您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多