3

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 を使用していますが、たまたま 2.24.10 です。

widgetQueueDraw-- Edit2: したがって、公開イベントから要求する代わりに外部タイマーを使用すると、問題が解決します。今のところはうまくいきますが、理由がわかりません。いくつかの GUI フレームワーク (ペイント イベントで GUI コントロールを無効にする) を使用して、いくつかの言語でこのアプローチを使用しました。通常、invalidate を呼び出すと、次に GUI スレッドが起動したときに読み取られるフラグが設定されるだけです。これは、GUI スレッドがフレームごとにコントロールを再描画することになりますが、実際にはそれがここで必要なことです。Gtk2Hs のように見えます。

4

1 に答える 1

0

あなたのプログラムは循環ループに入ると思います。ウィンドウがエクスポーズ イベントを受け取ったとき (つまり、ウィンドウ自体を再描画するように要求されたとき)、描画は行われません。代わりに、それ自体を強制的に再描画し、それが次に公開イベントを発行します。問題を 2 つの部分に分割する必要があります。widgetQueueDrawアニメーションの次のステップを準備する関数を呼び出し、シーンをウィンドウにレンダリングするための呼び出しを行うタイマーを設定する必要があります。実際のレンダリングは、ウィンドウの公開イベントへの反応として行う必要があります。

于 2013-04-27T14:16:20.203 に答える