あれ?DeleteGraphで解放されないメモリがあるぞ
「初音ミク冒険記」の第1章ボス戦のプログラムで
空きメモリのチェックをしていて気付いたこと。
どうやらDeleteGraphで完全にメモリ解放がされていない。
第1章のボス戦で使っている画像は3つある
1.ボスがトコトコ移動する画像
2.ボスがジャンプするときの画像
3.宝珠
これを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)】
このエントリーへのリンク
トラックバック
この記事へのトラックバックの一覧です: あれ?DeleteGraphで解放されないメモリがあるぞ:
コメント
このブログの新着コメントをRSSリーダに登録する為のxml