2015/04/13(月)RGSSの停止について

VXAceのゲームプレイ中に、このようなエラーが出る場合がある。
「RGSS3(RGSS2) Playerは 動作を停止しました」
rgss_error.png

RGSSをカスタマイズして制作しているもので、よく見かける。

今回、天に届ける迎春花を制作している途中でこの現象が発生した。
再現性は100%ではないが、どうもカスタマイズした処理を
通すと落ちるような挙動を示す。

これの原因は「メモリリーク」である。
簡単に言えば、メモリが正しく解放されていなくて、
Rubyのインスタンスが残ったままになっている状態にある。
ここからは予測になるが、画像(Bitmap系)がdisposeされないまま、
参照がされなくなってしまうと、GCが働いてdisppose前の
領域をGCスレッドがクリアしようとして、メモリ違反的な
ことになっているのではないかと思う。
最初は原因不明だったが、GC.disable = trueにすると
落ちなくなったので、GCが絡んでいると思われる。

やっかいなのは、問題解消方法である。
基本的にはnewされたインスタンスが
正しいタイミングでdisposeされていることを確認するという手法になるが、
どこで発生しているかを特定するのが難しいため、
何度もエラーを起こして特定するか、あるいは
ソースをしらみつぶしに見るしかない。

あとは、newした際に別自動的に管理インスタンスに登録して、
disposeされる前に参照されなくなるような仕組みを
自前で作るという案もあるが、大規模プロジェクトじゃないと
効果がでないと思う。

(旧約)帽子世界でも、同様のエラーで落ちることがあるが、
VX版のサイドビューを導入したときに、たまに落ちていることがあった。
新約ではキャッシュの有無を選択できるようにしているようである。
キャッシュを利用すれば、結果的に落ちないということは、
やはりGCが絡んでいると思われる。

この件については、なかなか検索でヒットしないので、書いてみた。
OK キャンセル 確認 その他