在Win32和Win64上使用GHC 7.4.2和GtkHs 0.12.4,这个程序占用的内存越来越多,在我的机器上耗费大约2Mb /秒。 我只是尝试使用Gtk制作动画(这就是为什么我使窗口无效以便立即重绘)。
我尝试使用RTS选项配置内存使用情况,但此内存不可见。
发生了什么事?
import Graphics.UI.Gtk
main :: IO ()
main = do
initGUI
window <- windowNew
onDestroy window mainQuit
onExpose window (\_ -> widgetQueueDraw window >> return True)
widgetShowAll window
mainGUI
- 编辑:我使用的是找到here的Gtk版本,恰好是2.24.10
- Edit2:因此,使用外部计时器而不是从公开事件请求widgetQueueDraw
可以解决问题。它现在会做,但我不明白为什么。我已经使用这种方法在几种语言中使用了几个GUI框架(在paint事件中使GUI控件无效)。通常,调用invalidate只会设置一个标志,下次GUI线程启动时会读取该标志。它最终会在每个帧重绘控件的GUI线程中结束,但这实际上就是我想要的。它看起来像是在Gtk2Hs中。
答案 0 :(得分:0)
我认为你的程序进入循环循环。当窗口收到公开事件(即请求重绘自身)时,您不进行任何绘图。相反,你强制它重绘自己,然后发出一个公开事件,依此类推。您必须将问题分成两部分。您应该设置一个计时器,该计时器调用一个准备动画下一步的函数,并调用widgetQueueDraw
将场景渲染到窗口上。实际渲染应该作为对窗口暴露事件的反应。