Amazon 初売り

« ごはんが炊けていなかった・・・orz | トップページ | あれ?DeleteGraphで解放されないメモリがあるぞ »

2012.01.17

PSPの空きメモリ

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

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

DXライブラリPortableのLoadGraph系関数が
エラーを返してくることがあるので調べてみたら、
やはりmallocでメモリ確保ができないでいるっぽい。

ならば空きメモリはどうなっているのか?

SDKの中に空きメモリを取得するものがあるだろう
と思い調べていたら
sceKernelTotalFreeMemSize
というのを発見。

カーネルってついているけど
ユーザモードでも使える関数なのかな?

実際に動かしてみる。
動いた。

どうやら使えるっぽい。

じゃあ、DeleteGraphの前と後で空きメモリを比べてみよう。

あれ?
DeleteGraphの前と後で空きメモリが同じなんだけど・・・

ちとくのホームページでメモリ関連を見てみる。
メモリの確保 その2によると
mallocで確保するヒープメモリと
APIで獲得するメモリは分けて考えるらしい。

DXライブラリPortableの内部ではmallocを使っているので
APIでは空きメモリが分からないようだ。

うーむ、と思っていたら
Dadrfyさんの「C言語?何それ?おいしいの?」の
メモ -空きメモリ取得-」の記事に
空きメモリを取得する関数発見!

そうかmallocで確保できるメモリが空きメモリと判断するんだ。
確かに納得だ。
Dadrfyさんが記事を作ってくれていて助かった。

関数では、100KB単位でやっているので
ちょっと改造して100KB単位でメモリ確保できなかったら
10KB単位、同様に1KB単位として空きメモリのチェックをするようにしてみた。
これで若干精度があがるだろう。

試してみる。
うん、キャンプメニューを表示するときの画像をメモリに展開する前の空き容量と
メモリ展開した後のメモリ容量に変化があって
DeleteGraphするとメモリ展開前の空き容量と同じになった。
少なくとも1KBを超えるメモリリークはしていないようだ。

早速、ログで空きメモリを確認すると「初音ミク冒険記」では
DxLib_Initが正常終了した段階で空きメモリが約20M。

PSPのメモリは32Mで、8Mはカーネルに持っていかれるから残りは24M。
つまりDxLib_Initで4Mメモリを使っているってことだ。
たぶんイントラフォントとかの読み込みとかだろうと想像。

「初音ミク冒険記」の初期処理が終わって
タイトルロゴが出る段階では、空きメモリが6.7M。
初期処理では効果音のロード、
汎用的に使う画像の読み込み、
Luaの初期化をしている。
この段階でも結構メモリ使っているのね。

第1章のボス戦までのマップ画像を読み込むと、空きメモリが2M。
ここでキャンプメニューを表示し、その直前の画像をメモリ展開すると残り1M。
つまり、キャンプメニューを開く直前の画像をセーブデータのアイコンにしたければ
常にメモリを1M以上は空けておけってことだな。

うーん、こりゃ第1章のボスの画像を一度読み込むと
メモリがパンパンになってしまうのも、うなづける。

ボス画像の読み込み失敗の後に宝珠の画像が読み込めることがあるのは
単純にメモリ展開するときのサイズが小さいからだな。

となると、ボス戦のマップに入ったら
ボス戦のマップでは使わない画像をDeleteGraphして
ボス戦関連の画像読み込みするようにすれば良さそうだ。

後は、猫山Pさんが教えてくれたDeleteGraphを繰り返すと
DXライブラリPortableがおかしな動きをするって件の発生頻度しだいだな。

キャンプメニューに入るときにメモリ確保して
キャンプメニューを抜けるときにメモリ解放するようにしているので。

DXライブラリPortableの中を詳しくトレースしてないので
確定的なことは言えないけど
LoadGraphなどで取得した画像ハンドルをDeleteGraphして
もう一度画像ハンドルを作ると同じ画像ハンドルが返ってくるときと
違う画像ハンドルが返ってくるときがあるみたいなので
違う画像ハンドルが返ってきたときには、
前の画像ハンドルの分のメモリが
余分に使われている状態なのかも?と想像してる。
(検証が微妙なので気のせいかもしれない・・・)

一応、これで様子を見てみよう。


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

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

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

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

トラックバック

この記事へのトラックバックの一覧です: PSPの空きメモリ:

コメント

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




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

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