[Armadillo:06669] GDK 画像表示の縮小でのメモリ問題

MasakiAoyama email@hidden
2011年 1月 28日 (金) 13:08:22 JST


青山です。

500FXで、1000x1000ピクセルの画像を縮小表示させて、

 ・液晶をタッチしたら拡大(原寸イメージの部分表示)
 ・もう一度タッチしたら全体の縮小表示に戻す。

というのをGdkのpixbuf関係で作成してみたのですが、

  1.縮小表示させるたびにfreeコマンドで見える空きメモリが減っていく
  2.しかし、残り2500程になると微増微減するだけで、それ以上大きく減る事は無い

という現象が生じています。
1番は、私の処理のやり方で何かやるべき手順を抜かしてるのかな。と思いますが。
2番は、何が起こっているのでしょうか?

こうすれば1番で毎回メモリが減る事はなくなる。本来はこうやるべき。とか、
2番があるから問題にはならない。等、詳しい方おられましたら解説・助言など頂
ければ幸いです。


具体的な処理の内容は、原寸サイズの元イメージのpixbufを持っておき、タッチ
ごとに
  ・表示エリアサイズに縮小したpixbuf作成 (gdk_pixbuf_scale_simple使用)
  ・表示エリアサイズに切り出したpixbuf作成 (gdk_pixbuf_copy_area使用)
というのを繰り返して表示を切り換えようとしています。
※原寸サイズの元イメージを持っているのは、他にボタンが押されたときに情報
  を重ね合わせて合成表示した上で縮小・拡大とかもやるため。
  よって縮小済みのpixbufを持っておいて毎回縮小はしないで済ませる、という
  手は使えません

gdk_pixbuf_copy_areaのときは、空きメモリは変動しませんが、
gdk_pixbuf_scale_simpleのたびに、空きメモリは減っていきます。

以下のように再描画処理を書いています。

// gtk_widget_queue_drawで呼び出されて再描画
gboolean image_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
    GdkPixbuf *pixbuf = (GdkPixbuf *)data;

    if(gi_flg == KAKUDAI_MODE)
    {
        // 範囲拡大
        // クリック時に確定された座標から切り出したpixbuf作成
        gdk_pixbuf_copy_area(g_pixbuf_base_image, base_click_x, base_click_y, 
                      DRAWAREA_WIDTH, DRAWAREA_HEIGHT, pixbuf, 0, 0);
    }
    else
    {
        // 縮小表示に戻す(原寸pixbufから縮小版pixbufを再作成)
        pixbuf = gdk_pixbuf_scale_simple( g_pixbuf_base_image, 
                    DRAWAREA_WIDTH, DRAWAREA_HEIGHT, GDK_INTERP_NEAREST );
    }

    gdk_pixbuf_render_to_drawable (pixbuf, widget->window,
                                    widget->style->fg_gc[GTK_STATE_NORMAL],
                                    0, 0, 0, 0,
                                    gdk_pixbuf_get_width(pixbuf),
                                    gdk_pixbuf_get_height(pixbuf),
                                    GDK_RGB_DITHER_NORMAL, 0, 0);

    return TRUE;
}




armadillo メーリングリストの案内