1

我刚开始在 haskell 中设计一些图形。我想创建一个带有旋转球体的动画图片,所以我创建了一个 IdleCallback 函数来不断更新角度值:

idle :: IORef GLfloat -> IdleCallback
idle angle = do 
  a <- get angle
  angle $= a+1
  postRedisplay Nothing

我每次都将角度加 1,因为我想让我的球体平滑旋转,而不是仅仅从这里跳到那里。问题是现在它旋转太慢了。有没有办法保持旋转平稳并使其更快?

非常感谢!

4

1 回答 1

1

这里没有太多事情要做。我在任何地方都没有看到明显的延迟,所以我猜它很慢只是因为更新需要多长时间?

它看起来也不是显式递归的,因此问题似乎超出了此代码段的范围。

另外我不知道您可能正在使用哪些库。

不过,总的来说,这IORef让我感到不开心。虽然在其他语言中拥有全局变量可能很常见IORef,但 Haskell 中的 s 有它们的位置,但通常是一个不好的迹象。

即使在另一种语言中,我也不认为我会使用全局变量来执行此操作。

如果您想在 Haskell 中进行时间更新,一种“常见”的方法是使用函数响应式编程库。

它们被构建为具有触发来自外部的信号的功能链,修改某物的状态,最终呈现输出。

我过去曾将它们用于(简单)游戏,在您的情况下,您可以构建一个系统,该系统每秒输入 24 次时钟信号,或者其他什么,并使用它来更新计数器并生成新图像点点滴滴。

我的回答有点含糊,但这个问题也有点含糊,所以希望我至少给了你一些可以研究的东西。

于 2015-11-27T03:32:49.513 回答