【问题标题】:Haskell IdleCallback too slowHaskell IdleCallback 太慢
【发布时间】:2016-02-25 00:24:18
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

    标签: haskell idle-processing


    【解决方案1】:

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

    它看起来也不是显式递归的,所以问题似乎超出了这个 sn-p 的范围。

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

    不过,总的来说,IORef 让我感到不开心。 虽然在其他语言中使用全局变量可能很常见,但 Haskell 中的 IORefs 有其一席之地,但通常是一个不好的迹象。

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

    如果您想在 Haskell 中进行时间更新,一种“常用”方法是使用 Functional Reactive Programming 库。

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

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

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

    【讨论】:

    • 嘿!我发现了问题,正如你猜到的,这不是 idlecallback 的问题,只是更新速度慢,所以动画很慢。我通过更改命令的顺序来修复它,将动画部分留在最后。感谢您对函数式反应式编程的建议,看起来很有趣,所以我会检查一下。谢谢你的回答:)
    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2012-01-09
    • 2019-02-12
    • 2012-02-02
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多