控制Haskell OpenGL中的“IdleCallback”(或触发“DisplayCallback”)

时间:2018-04-02 14:48:18

标签: haskell opengl

我已经完成了一个包,用Haskell中的OpenGL绘制隐式曲面。它可以在my github repo中找到。但这是非常缓慢的,这就是为什么我有关于我的Haskell OpenGL实践的十几个问题。这是第一个。

我总是定义这个idleCallback

idle :: IdleCallback
idle = postRedisplay Nothing

并在main文件中我将其包含在:

  idleCallback $= Just idle

然后,当我这样做时,我注意到以下事情。如果我包括例如

putStrLn "hello"

DisplayCallback中,当我运行程序时,hello以极快的速度重复打印在终端窗口中。这意味着每次打印DisplayCallback时都会hello被“扫描”。因此,如果我的DisplayCallBack生成例如要显示无数的三角形,我担心这种重复的“扫描”应该会引起一个问题。不是吗?

这是由于IdleCallback。的确,我试过了

  idleCallback $= Nothing

然后按预期显示图形并显示:

  1. hello不再在终端窗口中重复显示
  2. 我在KeyboardCallback中定义的“操作”(例如图形的旋转)不再有效,除非 - 参见3
  3. 但是,如果我按下产生这样一个动作的按键,虽然它没有直接影响,但按下鼠标左键后,其效果正确,并且hello出现在屏幕;因此,似乎鼠标左键触发了图形的“重新显示”(DisplayCallback)。
  4. 因此我想知道:总是做idleCallback $= Nothing然后做某事(但 what / how ,那是我的问题)触发“重新显示”是不是更好何时按下KeyboardCallback中引入的密钥?

    我认为这不会克服我的缓慢问题,但无论如何这是我想知道的问题之一。希望问题很明确......

    总而言之,DisplayCallback总是更新,即使它不需要更新,当idleCallback $= Just idle DisplayCallback时也是如此。我正在寻找仅在需要时更新KeyboardCallback的内容,即当且仅当我们按下MouseCallback中引入的密钥或其他此类回调(#define DllExport extern "C" __declspec( dllexport ) #include "SpeedTreeRT_1_8.h" DllExport CSpeedTreeRT* NewSpeedTree(void); DllExport void DeleteTree(CSpeedTreeRT* handle); DllExport bool LoadTree(CSpeedTreeRT* handle, const unsigned char* pBlock, unsigned int nNumBytes); 等)时。

1 个答案:

答案 0 :(得分:1)

感谢@ Ripi2,我找到了解决方案。这样做确实更好

idleCallback $= Nothing
<{1>}文件中的

,然后在main的帮助下触发DisplayCallback中的KeyboardCallback。更确切地说,我已经取代了

postRedisplay

keyboard :: IORef GLfloat -> IORef GLfloat -> IORef GLfloat -- rotations
         -> IORef Double -> IORef Double -- parameters a and b
         -> IORef Double -- isolevel
         -> IORef Double -- zoom
         -> KeyboardCallback
keyboard rot1 rot2 rot3 a b l zoom c _ = 
  case c of
    'e' -> rot1 $~! subtract 2
    'r' -> rot1 $~! (+ 2)
    .......
    'q' -> leaveMainLoop
    _   -> return ()

这可以按预期改善慢度问题(但它仍然很慢)。