カテゴリー
















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までの拍手お返事です。
●世知辛い……世知辛いなあドーラのぱんつ
■まだ言うか!

●死なやす
死ななければ安いダメージというバランス
ライフが満タンか死亡という1か0状態
どうせ1発死なので蘇生以外の回復は無駄
RPGだと珍しくないが稀に格ゲーでも発生する
■なるほどそういうゲーム用語たったのね死なやす鉄筋家族って

●PC操作中の「問題が発生したため~」の表示には何時も理不尽さを感じます…。
問題って何だ→レポート見ても分からん→トラブルシューティング→症状と同じ項目ない…

理由や原因が明示されず結果だけ突き付けられるのは、往々にしてあることとは解っていてもやりきれないですわ。
■実はずっと昔も「問題が発生したため~」系のエラーを直してて、その時もviewportが原因だったんですよね…これ系はだいたいviewportが怪しい

●当方のPCだと図書館だろうと雪山だろうと停止食らいますね

全部屋巡って敵殲滅してBoss倒して他のMapというのをやるのですが、これがあるために一気に巡れません
おかげでコンボで全体攻撃→全滅を何度もロードで免れてもいるのですが
リセット無しでの戦闘回数にも何か関係があるのかもしれませんね
■果たして今回の修正で他の人も落ちなくなったのか…ドキドキものです

●ちゃんと作れるのかどうか限界を正しく見積るのも重要エターナり回避スキルの1つですね
それは技術力にしても作業量にしてもツールの限界にしても
■つ…作れるんだもん!その気になれば作れるんだもん!その気になれないだけなんだもん!

●>ゲームの解像度も高くなってきたし、
4Kとか手書きも限界だから、みんな3Dオブジェクトに走ってますね。UIすらオブジェクト作ってるそうです。3Dは、一度作ってしまうと着せ替えやモーション流用が楽だし、拡大縮小もできる。でもドット絵時代の「演出」を考えた動きに比べると味気ない。漫画の効果線の偉大さを思い知る。
■高解像度になるとね…自分も4k環境だけど、4kソースで絵を描いたことは一度もないなぁ

●>■お祭りゲーは旬が大事やで。DQ話が一番盛り上がる時期は何だかんだでリアルタイム。ゲームも楽しいけど、そのゲームの話を友達とするのがまた楽しい

そうですけどね。もっともこちらは旬よりもゲーム性を重視してるスタンスですし、追加要素をぶっこんで来ると見てるってのが本音です。
■ゲーム性重視なら、3DS版のすれ違いで良いデータをゲットできるのはたぶんプレイ人口が最も多い今だけだと思いますよ

●>■もともとプログラマがコード書く負担を和らげるのが目的だったのに、逆に苦しめることになってしまうGCとはいったい…
いや、ポインタ解放忘れでリーク頻発してた頃と比べたら格段に楽やからマジで…
■GCくんは全然悪くありませんでした。悪くないGCくんのことを疑ったえぬくんはとっても悪い子だとおもいます!

●>魔女の笑い声?んなもん探しても見付からんやろマイクよこせや笑ってやんよねるねるねるねはうっひぇっひゃっひゃっ…
隊長によるフルボイス化が決まった瞬間であった…
■登場人物全員老婆かよ!

●>音楽以外全部1人で作るとなると~

えっ?
■気楽だぜ!

●7シナリオはDQで1,2を争う傑作だと思ってます。
でも7の評判が悪い最大の理由は、システムもバランスもほぼ全部が悪いからだよ!

11が「過ぎ去りし時を求めて」なら、
7はお前が救世主気取りで過去を改竄した結果がこれだよ。
今を生きよう。的な……
■そこまで評判が悪いってイメージでもないと思うんですけどね7

●ドラクエ11ようやくクリア!
すっげぇえええええ面白かったですね!
期待に応えつつ、予想を裏切り、きっちり勇者させてくれた
今回のドラクエは3と同レベルで好きかもしれませぬ。
ロールプレイってなんぞやって考えさせられますなぁ...。
■クリアおめ! すっげえええええ面白かったよね!
あたしゃ久々に感動したよ!

●うおー 新約たのしみだー
■はやく… はやく完成させたい!

●「虫っぽい敵を作ろう」ってやると大体カマキリになる
描きあがってしまったものを見て
やっぱり両手が武器っていうのはインパクトあるよなーと思う

ボスキャラにエピソードつけようとすると大体手塚治虫のパクりになる
こいつはサイボーグだけど脳みそは生身だから虫に弱い→火の鳥
こいつはクローン人間でうんたらかんたら→火の鳥
こいつは→火の鳥
みたいな
■カマキリのメスは交尾後のオスを食うって所もポイント高いですねぇ
あとお腹に黒いクリーチャー飼ってる第二形態も設定が細かくてGOOD!

●ゲームボーイの画面解像度が160x144ピクセルだから
200x200だとステータスウインドウ込みで腰くらいまでしか映らない
ちなみにガラケーなら480×854ピクセルくらいが一般的っぽい
■大昔のゲームボーイって画面真っ暗よね

●フリー効果音探せばニッチなものもかなりありそうですけどね。もっとも版権フリーでも価格はフリーじゃないかもですが
■探す時間のほうが作る時間よりもかかりそうで…

●帽子世界をこの度始めさせて頂きました!

始め、動作停止問題の記事と同じ症状がでましたが、
互換性設定をWindows7にすると少し安定したようです。
(プレイ環境はWin10Pro64bitです)

取り急ぎ、ご報告まで。
引き続きプレイして変化がありましたら報告しようと思います~
■報告ありがとです~
さあ果たして皆の環境で落ちなくなったのかなぁドキがムネムネしてきた…

●無印強制終了は長時間やってるときに多かった印象ですが…
自分のノーパソでも10時間かそれ以上に一回とかそのくらいの頻度でしか起きないので、確かにスペックとの関連は薄そうですかね。起きやすいところは他の方の報告と同じ。機関室はあまり意識しませんでしたがマップ移動時がほとんどでした。
■viewportをdisposeした瞬間にメモリ解放されるんじゃなくて、GCが拾った時にエラーが出るみたいなので、落ちるタイミングは環境によってまちまちかもしんないですね

●完成を心待ちにしています。
大変なのはすごく伝わってきますが、頑張って!無理のない範囲で!
■ありがとね!がんばるよぉ~!

 | ページTOPへ |  ザコグラ作成終わり >