作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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
-- 编辑:我正在使用找到的 Gtk 版本 here恰好是 2.24.10
-- Edit2:因此,使用外部计时器而不是从公开事件请求 widgetQueueDraw
可以解决问题。现在可以了,但我不明白为什么。我已经在多种语言和多种 GUI 框架中使用了这种方法(使绘制事件中的 GUI 控件无效)。通常,调用 invalidate 只是设置一个标志,该标志在下次 GUI 线程启动时读取。它最终在 GUI 线程中每帧重新绘制控件,但这实际上是我想要的。它看起来像 Gtk2Hs 中的“但是”。
最佳答案
我认为你的程序进入了循环。当窗口接收到暴露事件(即请求重绘自身)时,您不进行任何绘制。相反,您强制它重绘自身,这反过来又发出一个暴露事件,等等。您必须将问题分成两部分。您应该设置一个计时器,该计时器调用一个函数来准备动画的下一步,并调用 widgetQueueDraw
将场景渲染到窗口上。实际的渲染应该作为对窗口的暴露事件的 react 。
关于haskell - 为什么这个最小的 Gtk2Hs 程序会泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178219/
我是一名优秀的程序员,十分优秀!