【发布时间】:2013-08-14 14:14:31
【问题描述】:
我目前学习 Haskell 是为了好玩,因为我一直想看看您如何设计非面向对象的程序。
但我也在研究将 Haskell 用于游戏引擎是否有用。我主要关心的是 GC。
我知道 GHC 是并发的和线程本地的。
我读到 GC 通常会在 1ms-5ms 之间暂停。我知道每个程序都不同,但我仍然需要一些数字来进行一些计算。
假设我的游戏以60fps 运行,这意味着每一帧都需要0.016666667s 的计算,对吗? gc 暂停会将其增加到~0.017666667,从而导致56fps。所以这是~4fps或7%的性能损失。对我来说,这是一个相当大的打击。
现在我指望线程本地 GC,因为我希望我的游戏引擎是高度并发的。
我想为游戏代码使用 Actor 模型,这样每个实体都有自己的内存。如果我是对的,这意味着每个实体都有自己的本地垃圾收集。
但主要问题仍然是主循环的游戏引擎。 7% 的随机 fps 下降非常大。
我的计算是否正确?有什么建议可以给我吗?
【问题讨论】:
-
您假设 gc 在每个帧计算时运行。这可能是错误的。
-
@Nicolas 我不认为它会运行每一帧。我认为它会在某个时候运行,然后暂停它的本地线程。但是 1 毫秒的暂停会导致 60 fps 下降 4 fps。我不确定它什么时候运行,但我认为有一些参数可以调整。我仍然希望我是错的。
-
不,你在每帧计算中增加了 1ms。这意味着您假设在 每个 帧,由于 GC,您会损失 1 毫秒。根据你的计算,GC每秒被调用56次,运行时间为1ms。
-
您还假设在不考虑 GC 的情况下,您设法用有用的计算填充了所有 1/60 秒。
标签: haskell garbage-collection ghc