【问题标题】:How to prevent a javascript stack overflow?如何防止javascript堆栈溢出?
【发布时间】:2011-03-17 23:28:36
【问题描述】:

我一直在使用 javascript / jquery 构建 Conway's Life,以便在浏览器 Here 中运行它。 Chrome、Firefox 和 Opera 或 Safari 执行此操作的速度非常快,因此最好不要为此使用 IE。不过IE9还可以。 在生成新一代的生命时,我存储了前几代,以便能够回顾历史。这可以正常工作,直到内存填满,这会导致浏览器(选项卡)崩溃。

所以我的问题是:如何检测内存何时填满?我将每一代的数组存储在一个形成世代历史的数组中。这会占用大量内存,这会在几千代后使浏览器崩溃,具体取决于可用内存。 我知道javascript无法检查可用内存量但必须有办法......

【问题讨论】:

  • 我建议简单地将存储在内存中的状态数量限制为一些不错的默认值(对于 IE,您也可以将其设置为较低的数字)。

标签: javascript jquery memory artificial-life


【解决方案1】:

我怀疑是否有办法做到这一点。即使有,它也可能是特定于浏览器的。不过,我可以建议一种不同的方式。

不是存储每一代的所有数据,而是存储每隔一段时间拍摄的快照。由于 Conway 的生命游戏是确定性的,您可以轻松地从给定快照重新生成未来的帧。您可能希望保留几帧的缓冲区,以便可以使倒带更流畅。

实际上,这实际上并没有解决问题,因为您最终会用完空间。但是,如果您存储每个n 帧,您的应用程序将持续n 倍,这可能足够长。我建议您对可以回溯到过去的时间施加一些硬性限制,以便对必须存储的数量有一个上限。确定将是多少帧(30 FPS 时 10 分钟 = 18000 frames)。然后,将frames 除以您可以存储的帧数(分析各种网络浏览器以计算出这一点),这就是您应该使用的快照之间的间隔。

【讨论】:

  • 感谢您的回答。很好的想法,尤其是关于快照。
【解决方案2】:

Dogbert 几乎做到了。您无法确切知道有多少可用内存,但您可以知道您的数据集可能有多大。

因此,将存储在数组中的每个对象的大小乘以数组维度,这就是一次迭代的大小。将其乘以所需的迭代次数以查看总共需要多少空间,并进行相应调整。

或者,受 Travis 的启发,简单地从最后一个已知数组反向运行模式。毕竟是确定性的。

【讨论】:

  • 康威的生命游戏可能是确定性的,但它是不可逆的。那时我根本不需要历史存储:)
  • 我猜你是对的!我的不好,对不起,下次我会复习这个主题!
猜你喜欢
  • 2012-02-03
  • 2016-10-02
  • 2010-10-29
  • 1970-01-01
  • 2012-08-24
  • 2011-06-24
  • 1970-01-01
  • 2013-11-15
  • 2010-09-06
相关资源
最近更新 更多