GC在Haskell中暂停以进行软实时应用

Mai*_*ein 5 garbage-collection haskell ghc

我目前正在学习Haskell的乐趣,因为我一直想看看你如何以非面向对象的方式设计程序.

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

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

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

假设我的游戏运行60fps就意味着每一帧需要0.016666667s计算吗?gc暂停会增加这~0.017666667导致的结果56fps.所以它的性能损失~4fps7%.对我来说这是一个非常大的打击.

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

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

但主要问题仍然是游戏引擎的主循环.随机fps下降7%是相当大的.

我的计算是否正确?你能给我的任何建议吗?

Nic*_*las 2

你的计算有偏差。

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

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

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

  • @MaikKlein 您应该观看 John Carmak 的 QuakeCon 2013 主题演讲。他准确地谈论了这个问题并提出了一个可能的解决方案。他描述了在 C++ 中实现他的想法,但我相信您可以通过 C 外部指针管理纹理等来实现他在 Haskell 中描述的操作。 (2认同)