[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 メーリングリストの案内