我刚刚开始在haskell中设计一些图形。我想用旋转球体创建一个动画图片,所以我创建了一个IdleCallback函数来不断更新角度值:
idle :: IORef GLfloat -> IdleCallback
idle angle = do
a <- get angle
angle $= a+1
postRedisplay Nothing
我每次都给角度加1,因为我想让我的球体平滑旋转,而不是从这里跳到那里。问题是现在它旋转太慢了。有没有办法保持旋转平滑并使其更快?
非常感谢!
答案 0 :(得分:1)
这里不是很多。我没有在任何地方看到明显的延迟,所以我猜测它因为更新需要多长时间而变慢?
它也看起来不是显式递归的,所以看起来这个问题超出了这段代码的范围。
另外,我不知道您可能正在使用哪些库。
但总的来说,IORef
让我感到不快乐。
虽然在其他语言中使用全局变量可能很常见,但Haskell中的IORef
有它们的位置,但通常是一个不好的标志。
即使是另一种语言,我也不认为我是用全局变量做的。
如果你想在Haskell中做一些时间更新的事情,那就是常见的&#34;方法是使用Functional Reactive Programming库。
它们被构建为具有触发来自外部的信号的函数链,修改某事物的状态,最终呈现输出。
我过去曾经在(简单)游戏中使用它们,在你的情况下,你可以构建一个每秒钟24次或其他任何时钟信号的系统,并使用它来更新计数器和产生一个新图像到blit。
我的回答有点模糊,但问题也有点模糊,所以希望我至少给你一些东西可以研究。