光泽动画生涩,希望在GHCi中添加 `-O2`

问题描述 投票:0回答:1

我正在 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

谢谢。

haskell ghci gloss
1个回答
1
投票

使用字节码解释器启用-O2

自 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 完全避免字节码

如果上述方法不够快,还有另一种选择。您可以使用选项

-fobject-code
将加载的 Haskell 源文件编译为本机目标代码而不是字节码。这会更快(甚至可以在较旧的 GHC 版本上与
-O2
结合使用)。然而,某些 GHCi 功能无法像断点和查看非导出函数那样工作。

此处文档中的更多信息:

https://downloads.haskell.org/ghc/9.8.1/docs/users_guide/ghci.html#compiling-to-object-code-inside-ghci

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.