我正在 Haskell 中尝试 gloss 包,并且已经能够在 Windows 上成功构建和运行一些示例。
问题是动画不稳定。
摘自《光泽》官方页面:
问:动画看起来很不稳定。
A:确保您使用 -O2 线程进行编译。如果没有线程运行时,管理帧速率的代码将表现得很糟糕。这是因为在睡眠定时器到期后,GHC 需要很长时间才能重新安排光泽进程。使用线程运行时,大多数简单的动画应该以大约 100fps 运行,这是我们的内部帧速率上限。
是的。在我的 cabal 文件中添加
ghc-options: -O2 -threaded
后,该问题就被消除了(运行 .exe
文件时)。
但是如何消除REPL中的生涩现象呢?
我已经尝试过了
cabal repl
ghci> :set -threaded
ghci> :set -O2
when making flags consistent: warning:
Optimization flags are incompatible with the byte-code interpreter; optimiza
tion flags ignored.
ghci> main
它不起作用,即动画仍然是混蛋。
看来问题不只是
-threaded
,而是涉及到-O2
。
有没有办法解决这个问题。
GHC 9.6.3,光泽度 1.13.2.2
谢谢。
自 GHC 9.8 起,您可以在 GHCi 中启用优化:
在 GHC 9.8 之前,优化被认为太不稳定,无法与字节码解释器一起使用。此限制已取消, 但仍被视为实验性的并受到保护
,默认启用。为了使用优化,请运行:-funoptimized-core-for-interpreter
ghci -fno-unoptimized-core-for-interpreter -O
https://downloads.haskell.org/ghc/9.8.1/docs/users_guide/ghci.html#faq-and-things-to-watch-out-for
尽管该标志的文档中还有另一个警告:
不建议正常使用,可能会导致编译器恐慌。
如果上述方法不够快,还有另一种选择。您可以使用选项
-fobject-code
将加载的 Haskell 源文件编译为本机目标代码而不是字节码。这会更快(甚至可以在较旧的 GHC 版本上与 -O2
结合使用)。然而,某些 GHCi 功能无法像断点和查看非导出函数那样工作。
此处文档中的更多信息: