【问题标题】:GC pauses in Haskell for soft real time applicationsHaskell 中的 GC 暂停用于软实时应用程序
【发布时间】:2013-08-14 14:14:31
【问题描述】:

我目前学习 Haskell 是为了好玩,因为我一直想看看您如何设计非面向对象的程序。

但我也在研究将 Haskell 用于游戏引擎是否有用。我主要关心的是 GC。

我知道 GHC 是并发的和线程本地的。

我读到 GC 通常会在 1ms-5ms 之间暂停。我知道每个程序都不同,但我仍然需要一些数字来进行一些计算。

假设我的游戏以60fps 运行,这意味着每一帧都需要0.016666667s 的计算,对吗? gc 暂停会将其增加到~0.017666667,从而导致56fps。所以这是~4fps7%的性能损失。对我来说,这是一个相当大的打击。

现在我指望线程本地 GC,因为我希望我的游戏引擎是高度并发的。

我想为游戏代码使用 Actor 模型,这样每个实体都有自己的内存。如果我是对的,这意味着每个实体都有自己的本地垃圾收集。

但主要问题仍然是主循环的游戏引擎。 7% 的随机 fps 下降非常大。

我的计算是否正确?有什么建议可以给我吗?

【问题讨论】:

  • 您假设 gc 在每个帧计算时运行。这可能是错误的。
  • @Nicolas 我不认为它会运行每一帧。我认为它会在某个时候运行,然后暂停它的本地线程。但是 1 毫秒的暂停会导致 60 fps 下降 4 fps。我不确定它什么时候运行,但我认为有一些参数可以调整。我仍然希望我是错的。
  • 不,你在每帧计算中增加了 1ms。这意味着您假设在 每个 帧,由于 GC,您会损失 1 毫秒。根据你的计算,GC每秒被调用56次,运行时间为1ms。
  • 您还假设在不考虑 GC 的情况下,您设法用有用的计算填充了所有 1/60 秒。

标签: haskell garbage-collection ghc


【解决方案1】:

你的计算有偏差。

你是对的:60 fps = 每 0.0166667 秒 1 帧。

让我们假设(最坏的情况)GC 将程序暂停 5 毫秒。每次 GC 运行时,您损失 0.005。这意味着每次调用 GC 都会损失 0.333 fps。

为了获得正确的计算,我们需要知道 GC 的调用频率,我不知道,这肯定与您的程序生成的数据量有关。

【讨论】:

  • 谢谢,我只是不知道我会产生多少垃圾,所以我无法预测暂停时间。如果我现在开始在 Haskell 中编写我的引擎并且我在 2 年内看到暂停时间是不可接受的,那么这有点糟糕,那么我刚刚失去了 2 年的时间。 (有点)
  • 然后首先使用 C++ 或编写负载测试。
  • @MaikKlein 您应该观看 John Carmak 的 QuakeCon 2013 主题演讲。他确切地谈到了这个问题并提出了一个可能的解决方案。他描述了在 C++ 中实现他的想法,但我相信您可以通过 C 外部指针管理纹理等来完成他在 Haskell 中描述的操作。
  • @AndrewMyers 实际上我几天前看过这个,这就是我学习 Haskell atm 的原因:)。我完全错过了 gc 部分。他说制作每帧 gc 是完全可行的,这可能就是我要做的。谢谢
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多