我已经完成了一个包,用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
然后按预期显示图形并显示:
hello
不再在终端窗口中重复显示KeyboardCallback
中定义的“操作”(例如图形的旋转)不再有效,除非 - 参见3 hello
出现在屏幕;因此,似乎鼠标左键触发了图形的“重新显示”(DisplayCallback
)。因此我想知道:总是做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);
等)时。
答案 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 ()
这可以按预期改善慢度问题(但它仍然很慢)。