« 吉里吉里Z Android版は将来的に他アプリ連動があると良い? | メイン | メモリ断片化対策とバグフィック版をリリース »

2016年07月30日

吉里吉里Z 開発:: メモリ断片化対策再び

    

「ビットマップ用メモリを確保できません」と言うエラーが頻発しているようで再び対策。

Twitter での情報によると設定でメモリ確保方法を malloc にすると発生しなくなるとか。

前回のメモリ断片化低減対策で入れた分割ヒープでほとんど発生しなくなると思っていたんだけど、どうもうまくいかない様子(発生頻度が増えると言う報告もあり)。
分割ヒープ + グラフィックキャッシュなし + ghcompact有効化 でどうなのかはわからず。
差分も多く大きいサイズもあるようで、ばらつきが大きいから2分割では効果薄いのか、分割されることで LFH の効果が阻害されているのかもしれず。

malloc にすると発生しないと言う情報を信じて、プロセスヒープから確保するバージョンを実装しブランチに入れた。
デフォルトも GlobalAlloc からプロセスヒープを使うものに変更。
どの方式でもメモリ確保に失敗した時、TJS2 の GC を実行して、ヒープのコンパクションも実行した後メモリ確保をリトライするようにもした。
これで解決するか?

malloc は CRT ヒープから確保されるので、プロセスヒープではないが、CRT 静的リンクの時 exe と dll で別になる。
exe で malloc 確保したものを dll で free して開放したりするとエラーが出る( wrap して exe 側で確保・解放されるようにしているので吉里吉里Zでは malloc 設定でも問題ないはず )。
など、いくつか問題もある。
プロセスヒープは、Win32 API内のメモリ確保などで利用されている様子。
GlobalAlloc は、吉里吉里2の時の実装がそのようになっていたので、Zでもデフォルトはそうしていた。
吉里吉里2は、C++Builder だったし XP 以前 LFH の恩恵もなかったし、メモリ確保周りは色々と変更されてきているから、現在だと好ましくないのかもしれない。
後 Windows10/VC2012 で確認すると GetProcessHeap と _get_heap_handle が同じハンドルを返すので、プロセスヒープと CRT ヒープは今の環境では分割されていないのかもしれない。

設定による挙動の違いなど分かりづらいので、実際にゲームを買って設定いじって見てみることにする。


投稿者 Takenori : 2016年07月30日 22:52




comments powered by Disqus
Total : Today : Yesterday : なかのひと