RGSSPlayer停止問題解決
2017/08/17
先日RGSSPlayer停止問題をネタにしましたけど、なんと運良くエラー再現率の高いセーブデータを作る事に成功しました!これはめちゃめちゃ嬉しい!
いよいよこの正体不明のラスボスと正面から対峙する時がきたかッ!
いい加減にその姿を現せ、大魔王ッ!!
新約で追加した新マップで穴から落ちた時に高い確率(おそらく1/3くらい)で強制終了する。ここはテストで何回もチェックした所だったんですけど、その時はたまたま1/3が連続で来なかっただけらしい。何という偶然。
この光の玉(セーブデータ)があればラスボスを葬れる!覚悟するがいい!
んで再現データでいろいろ原因を調べてみたところ…
次々と出てくる新事実!
結論から先に書くと、強制終了元となる犯人を特定して原因を取り除くことができました。うひひひ!大魔王破れたりッ!!
せっかく再現データができたのでいろいろ試してみたんですよ。
まず、GCに原因があると予想していたので試しにGCを切ってみたところ、やっぱりエラーは発生しないようになりました。もちろんこれは解決策ではありません。ていうかGC自体は悪くありませんでした。
しかも面白いことに、GCを切ってエラー回避した後でF12を押してゲームリセットしようとすると、F12押した瞬間にエラー落ちするんですよ。これはどういうことかというと、F12を押してゲーム再起動時にGCを実行していて、その時に落ちてるんじゃないかなぁと思います。
このことから推測するに、おそらくメモリ解放の際に何らかの違反が発生していて、その部分に触れた瞬間にエラー落ちしているんじゃないかと。
だからGCを切るとメモリを解放しないので違反が発生せず、F12を押してGCが実行された瞬間、問題部分に触れてエラーになっているのかもしれません。
で、いろいろ深く掘っていくと、特定のviewportを解放するとエラー落ちすることが分かって、さらにそのviewportは特定の遠景に関連付けたものだということまで判明します。どんどん明かされていくラスボスの正体ッ!
その特定の遠景とはマップで設定の無い遠景で、キャッシュした透明画像を割り当てることでエラー落ちしなくなりました。たぶんこいつがメモリ違反の原因となっていたのでしょう。いちおう戦闘時の遠景処理も見直しました。
エラーの原因はbitmapが貼られていないスプライトを関連付けたviewportの解放だという事が分かったので、他に該当しているものがないか探しました。
立ち絵の一部パーツ、戦闘でスキル名を表示する窓、分解アイテムの詳細窓が該当しましたが、これらはviewportに関連付けされていないので、恐らくエラーの原因にはなっていないと思われます。念の為に修正したけど。
ただし、帽子所有ウィンドウの返還アニメ画像、武器オーラ、サイドビューの残像はviewportに関連付けされていてbitmapが割り当てられていないケースがありえたので、おそらくエラーの原因になっていたかもしれません。まあ残像は使ってなかったから戦闘後に落ちる犯人は武器オーラでしょうけど。
Sprite.newあるいはPlane.newしたら必ず直後にbitmapを割り当てる。
じゃないとbitmapデータの無いスプライトを関連付けしたviewportを解放する際にメモリ違反が起きやすくなる。これがRGSSPlayer動作停止エラーの原因の一つだったんです。
ユグドラシルの機関室でなぜよく落ちていたのか。
それは機関室前のモノローグイベントで遠景のないマップに飛んでいたからだったんです。つまり機関室だけじゃなくて管理人部屋全部が落ちやすかったんでしょうね。ゲーム後半で落ちなくなるのも、終盤はモノローグイベントが無くなるから!ネタが分かると何て簡単な話だったんだろう…
このトラップはけっこうハマリやすいんですよ。
例えば上の武器オーラにしても、強化0の武器には割り当てるbitmapがないからSprite.newしたまま何もせず解放しちゃって、このスプライトに関連付けしてたviewportをメモリから解放する時にメモリ違反が起きるわけです。
例え割り当てるbitmapが無くても、必ずbitmap = Cache.system("")みたいに書いて、解放前に透明なbitmapを割り当てなきゃいけなかったんです。
空スプライトそのものは悪さをせずメモリにも悪影響を与えない。けどこれにビューポートが関連付けした瞬間に牙を剥く。いわゆるコンボ的なエラーだったんですね。
ただし他にも条件があるみたいで、単にSprite.new(viewport)して解放する記述をしまくってもメモリ違反は再現できないみたいです。
たぶんこの条件が強制終了しやすい人としにくい人の差になってるんでしょうけど、さすがに何の条件かまでは分かりません。まぁそれを探す意味はあんまりないですね。確実にエラーを防げる方法さえ分かればいいんです。
実は確実にRGSSPlayer停止を再現できる方法があります。
適当にviewportを作ってスプライトに割り当てた後、スプライトを解放しないままviewportを解放する。この処理を4~5回くらい繰り返すと高確率で強制終了します。viewportを割り当てないと再現できないというのがミソで、単にスプライトを解放していないだけだとエラーは出ません。これは今回自分が出くわしたエラーとまた違う種類のラスボスみたいですね。両者に共通するのはviewportなので、RGSSPlayer停止を喰らったらviewport周りを怪しんでみるといいかもしんない。
これでエラー再現データでも一切落ちなくなったのでめでたしめでたし…なんですけど、チェックが抜けていないとも言い切れません。ここは焦らずプレ公開の時にも情報を集めていきたいと思います。ただ、少なくとも今回の修正によって強制終了エラーが大幅に改善されたのは間違いありません。
ラスボスは倒され、世界に平和が訪れた!
しかし倒れ際に大魔王は言った。私の他に第二第三の魔王がメモリ違反を起こすであろうと。そう…ボクたちの戦いは始まったばかりだ!
それにしても。
エラーは再現できると解決が早いですね。
RGSSPlayer停止系は同じ条件でも落ちたり落ちなかったりするから再現までが大変ですけど、高い再現率のデータさえ用意できればこっちのもんですよ。
とはいえ、この再現データは偶然生まれたものです。
落下するだけのマップって無印じゃ無かったから、テスト用に穴に落ちる前のデータを作ってて、たまたまそれをロードして落ちたらエラーが出たんです。
落下するだけのマップだから遠景が無かったわけですね。
3回に1回落ちると書きましたけど、落ちない時は10回やっても落ちず、落ちる時はほぼ毎回落ちるといった感じで検証にも時間がかかりました。
とりあえず新約最大の懸念が解消されてとても満足です。やったー
8/17までの拍手お返事です。
■まだ言うか!
■なるほどそういうゲーム用語たったのね死なやす鉄筋家族って
■実はずっと昔も「問題が発生したため~」系のエラーを直してて、その時もviewportが原因だったんですよね…これ系はだいたいviewportが怪しい
■果たして今回の修正で他の人も落ちなくなったのか…ドキドキものです
■つ…作れるんだもん!その気になれば作れるんだもん!その気になれないだけなんだもん!
■高解像度になるとね…自分も4k環境だけど、4kソースで絵を描いたことは一度もないなぁ
■ゲーム性重視なら、3DS版のすれ違いで良いデータをゲットできるのはたぶんプレイ人口が最も多い今だけだと思いますよ
■GCくんは全然悪くありませんでした。悪くないGCくんのことを疑ったえぬくんはとっても悪い子だとおもいます!
■登場人物全員老婆かよ!
■気楽だぜ!
■そこまで評判が悪いってイメージでもないと思うんですけどね7
■クリアおめ! すっげえええええ面白かったよね!
あたしゃ久々に感動したよ!
■はやく… はやく完成させたい!
■カマキリのメスは交尾後のオスを食うって所もポイント高いですねぇ
あとお腹に黒いクリーチャー飼ってる第二形態も設定が細かくてGOOD!
■大昔のゲームボーイって画面真っ暗よね
■探す時間のほうが作る時間よりもかかりそうで…
■報告ありがとです~
さあ果たして皆の環境で落ちなくなったのかなぁドキがムネムネしてきた…
■viewportをdisposeした瞬間にメモリ解放されるんじゃなくて、GCが拾った時にエラーが出るみたいなので、落ちるタイミングは環境によってまちまちかもしんないですね
■ありがとね!がんばるよぉ~!
< ボスグラ作成中
| ページTOPへ |
ザコグラ作成終わり >