« PSPの空きメモリ | トップページ | DXPのLoadGraph内のLoadPngImageに怪しいところ発見! »

2012.01.17

あれ?DeleteGraphで解放されないメモリがあるぞ

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

「初音ミク冒険記」の第1章ボス戦のプログラムで
空きメモリのチェックをしていて気付いたこと。

どうやらDeleteGraphで完全にメモリ解放がされていない。

第1章のボス戦で使っている画像は3つある

1.ボスがトコトコ移動する画像
Enemy0501_2

2.ボスがジャンプするときの画像
Enemy0502_2

3.宝珠
Houjyu

これを1と2の画像は、LoadDivGraphでそれぞれ2枚の画像にして
3の画像は、LoadGraphで読み込んでいる。
読み込む順番は、1→2→3としている。
これまではDeleteGraphを使っていなかったがボス戦に勝利した後
3→2→1の順にDeleteGraphしてみた。

ログを抜粋し、説明用に英字を入れてみた
A:Boss LoadDivGraph 1 before Free Memory=3,001,344 byte
B:Boss LoadDivGraph 2 before Free Memory=2,211,840 byte
C:Boss LoadGraph before Free Memory=1,423,360 byte
D:Boss LoadGraph after Free Memory=1,418,240 byte
<中略>
E:Boss DeleteGraph 1 before Free Memory=1,418,240 byte
F:Boss DeleteGraph 2 before Free Memory=1,422,336 byte
G:Boss DeleteGraph 3 before Free Memory=2,207,744 byte
H:Boss DeleteGraph after Free Memory=2,994,176 byte

期待していたのはCの空きメモリとFの空きメモリが一致していること
なのだが、1,024合わない。
同様にBとGも一致すると思ったのだが、4,096合わない。
同じくAとHも一致すると思ったのだが、7,168合わない。

LoadDivGraphは、1の画像を読み込んだ後に2つの画像に分けている。
つまりLoadDivGraph1回で内部的には3つのイメージハンドラを使っている。
ということは、LoadDivGraph2回とLoadGraph1回だと7つのイメージハンドルを使う。

DeleteGraph1回で未解放なのが1,024。
7つのイメージハンドル×1,024=7,168となるので計算は合う。

これだと猫山Pが
png画像の読込&削除を繰り返すと挙動がおかしくなる
で書いた通り、そのうち画像を読み込めなくなるだろう。

1つの画像ハンドルあたり1024バイトなのは
かげさんの空きメモリチェックの単位が1024バイト単位だからだと思うので
実際には、もっと少ない解放漏れかもしれないけど。

DadrfyさんのDX Library Portable kai v3.2にある関数
MakeGraphFromScreenで作った画像ハンドルは問題なく
DeleteGraph後に完全解放されているので
違いが分かれば解決できるかもしれないけど
DXライブラリPortableの中は難しいんだよなぁ・・・



 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

このエントリーへのリンク

このエントリーのリンクを入れるHTML:

トラックバック

この記事へのトラックバックの一覧です: あれ?DeleteGraphで解放されないメモリがあるぞ:

コメント

このブログの新着コメントをRSSリーダに登録する為のxml




←名前とメールアドレスは必須です。
URLも記入すれば、URLのみが公開されます。
メールアドレスのみですと、メールアドレスが公開されてしまいますので、御注意ください。

↓コメント本文では、「a href」「b」「i」「br/」「p」「strong」「em」「ul」「ol」「li」「blockquote」「pre」のタグが使えます。絵文字をクリックすると、本文にタグを挿入できます。