並列処理の重さをどうすればよいのか

jaja
記事: 144
登録日時: 2015年12月30日(水) 17:47

並列処理の重さをどうすればよいのか

投稿記事by jaja » 2019年2月16日(土) 19:01

トリアコンタンさんのゲーム内時間の導入プラグインとterrax lightningプラグインを併用し
夜になるとライトが点灯する並列処理のイベントを設置しました。色調補正だけでは夜を表現しきれないためにterrax lightningを使いました。ただこの状態でテストプレイをしますとフリーズが発生するようになりました。
ちょっと文章の表示を高速化させたりすると。処理が落ちて止まってしまいます。こういう事が起こる事はわかってましたので。ライトの種類をあまり使いすぎないようにと対策をしていたんですが、テストプレイをしていると思った以上にフリーズの問題が浮き彫りになり。どうも並列処理での夜の表現には無理があるんじゃないかと思い至るようになりました。なにかこの問題のいい解決法、解決法ではなくアドバイスでもよいので何かわかる方いらっしゃいましたら、よろしければ、お教示お願いします。
私としましては並列処理を使用する事でゲームがカクつくのを恐れ、あまり自分のゲーム内で並列処理を使ってきませんでした。というか皆無でした。快適にプレイしてもらいたいからです。
並列処理という可能性を捨て去る場合は自動実行+イベントの一時消去で夜を表現するつもりではあります。

あとその並列処理イベントをマップに設置していると、たとえ処理落ちすることなく利用できていても
やっぱり多少カクついてます。それも気になってどうしたものかと思いました。

アバター
seea
記事: 84
登録日時: 2016年6月04日(土) 21:48
連絡を取る:

Re: 並列処理の重さをどうすればよいのか

投稿記事by seea » 2019年2月16日(土) 19:38

こんばんは。
マップに置くと重くなるということは、並列処理のイベントの内容によるのかもしれません。
並列処理イベントはそれ単体では重さにほとんど影響がないため、他に原因がある可能性も結構あって、
マップやイベントを含む全体を拝見しないと正確な回答が難しいと思います。

terrax lightingプラグインは単体でそこそこ重いので、それが主原因のケースと、そうではないケースがあり
今のところ情報が少ないため見分けが付かないです。
terrax lighting固有の重さの問題は、マップをある程度小さくすることでほぼ解消するので試してみて下さい。
おおよそ 40x40 くらいまでの大きさでしたら、影響はほぼ無いです。
曖昧な表現が多くなってしまいましたが、ライトの数や使い方により大きく状況が変わるためです。

並列処理イベントの内容が原因の可能性もあります。内容で重くなっていると目立ちやすいためです。
夜の表現や、ライトをつけるだけでしたら並列処理はいらないんですが、
イベントを並列処理にした理由は何でしょうか?
jaja
記事: 144
登録日時: 2015年12月30日(水) 17:47

Re: 並列処理の重さをどうすればよいのか

投稿記事by jaja » 2019年2月16日(土) 20:04

seeaさん、お返事ありがとうございます。ええ、まず私も質問しておきながら何から書けばと思ったんですが、画像のイベントをマップに一つ配置しています。早朝、朝 昼 夕 夜 深夜 (7番目はこの並列停止のスイッチです)6つの時間帯で夜深夜の2つの時間帯にのみライト点灯させるイベントを組んでます。他の時間帯はOFFにしています。マップの大きさは最大マップで130✕130で、ただこれは例外ですね。ここまで大きいマップは一つぐらいです。ライトの数はどうでしょうか、ポツンと一つ大きなのを利用しているというわけではありません。画像ではリージョンライトが3つですが、最高でも6つか7つ。それ以上はダメだとしておきました。それらを散りばめてますが、適当に使いまくってるわけでもないです、でも多いかもしれませんね。今ざっと一つマップを見てみたんですが幅31高さ39のマップでリージョンライトを27配置させてました。ただ私にはライトの数、ライトの大きさなどがどれだけ処理を圧迫するのか、わかっていません。

並列処理にした理由は…ええっとですね。確か最初は自由にプレイヤーが時間帯を設定できるようにでした。
メニューから時間を設定してすぐ夜にも朝にもできる。それに対応できるように並列処理にしたんだと思います。
ただ現在このような問題にぶちあたってるという感じです。

コモンイベントに何が入ってるか気になったかも知れませんが
色調変更だけです。夕方にはちょっと色調が赤くなるといった具合に
添付ファイル
SnapCrab_NoName_2019-2-16_19-50-45_No-00.png
アバター
seea
記事: 84
登録日時: 2016年6月04日(土) 21:48
連絡を取る:

Re: 並列処理の重さをどうすればよいのか

投稿記事by seea » 2019年2月16日(土) 20:53

ご確認ありがとうございます。
イベントID:010を拝見しました。

7番目はこの並列停止のスイッチとのことですが、コモンイベント:深夜の実行内容で
スイッチを操作して、並列処理を止めているのでしょうか?
仰るように色調変更だけでしょうか?

他のイベントの状況にもよりますが、
イベントID:010の内容ですと、条件を満たしたときに実行内容が何度も実行される可能性があります。
そこが原因かもしれません。イベントが一つとはいえ、結構コストが掛かる処理ですので。
コモンイベントの色調変更も少なくないコストです。コモンイベントの重さは無視できますが色調変更がそこそこ時間使います。

このイベントID:010を置いたときに重くなるんでしたよね?
となりますと、このイベントの挙動を集中的に見ていった方が解決に近付くと思います。

内容を考えると深夜の時間帯に変わったときに一度だけ動けば良いと思われますので
スイッチを一つ使って時間帯変化済みを表し、それを出現条件に加えて
イベントの実行内容が一度動いたあとは、何度も同じ内容を動かさないようにスイッチで制御する案があります。
イベントID:010の実行内容は、時間帯変化済みスイッチをONにするコマンドを末尾に足しておきます。
セルフスイッチですと外から扱いづらいので、ここではスイッチの利用が良いと思います。

そのままですとこのイベントが二度と動かなくなってしまいますので、
時間帯が切り替わったときそのスイッチをOFFにする仕組みが、このイベントの外側に必要になります。
プレイヤーが切り替えたときは、その時に動くイベントで、時間帯変化済みスイッチをOFFにします。
そうすると並列処理が一度だけ動いて、適切な色調とライトに切り替えてくれます。

問題は、普通にプレイ中に時間経過により時間帯が変わってしまったときです。
スイッチ切り替えのために別の並列処理を用意すると、キリがないというか本末転倒なので、
できればその処理はイベントコマンドではなく、スクリプト(プラグイン)側に入れたいですね。
ゲーム内時間の導入プラグインの内部でスイッチをOFFにできると、もっとも軽い仕組みになります。

ひとまず、並列処理が何度も動いていないか確認してみて下さい。
jaja
記事: 144
登録日時: 2015年12月30日(水) 17:47

Re: 並列処理の重さをどうすればよいのか

投稿記事by jaja » 2019年2月16日(土) 21:38

まずコモンイベントですが深夜。早朝、朝、昼、夜全ての時間帯にに念のためつけ加えておいたもので、
現在その中身は時間帯に色調変更イベントが一つはいってるだけです。例えば深夜はライトを使って夜を表現しますので色調変更しません。よって(0,0,0,0,)1フレームとしていれています。
色調変更の時間というのはフレームの事でしょうか?基本的には1フレームです。

出現条件に時間帯変化済みという名称のスイッチを加えました。
イベント実行内容の末尾に加えました。画像のようであってますでしょうか?

2つ画像がありましてもう一方は選択肢にスイッチオフを加えた図です。

すいません、解釈が全く間違ってるかも知れません。テストプレイしてちゃんと動いてないので。
添付ファイル
SnapCrab_NoName_2019-2-16_21-33-51_No-00.png
SnapCrab_NoName_2019-2-16_21-31-21_No-00.png
アバター
seea
記事: 84
登録日時: 2016年6月04日(土) 21:48
連絡を取る:

Re: 並列処理の重さをどうすればよいのか

投稿記事by seea » 2019年2月16日(土) 22:11

ご確認ありがとうございます。
色調変更の時間というのは、処理時間のことです。簡単に書くと、色調変更は(その設定内容によらずコマンド自体が)重たい処理です。

テストプレイで動かない原因ですが、
すみません。スイッチのONとOFFの説明が逆でした。
【修正案】
「時間帯変化済み」ではなく「時間帯変化必要」等に変更して、
出現条件は今のまま、実行内容の末尾では「時間帯変化必要」スイッチをOFFに、
そして、時間帯変化の処理が必要になったタイミングでスイッチをONにしてください。

【別の案】
「時間帯変化済み」の名称と役割はそのままで、並列処理イベントID:010にEVページを末尾に一つ追加して
そのページの出現条件を「時間帯変化済み」スイッチとし、実行内容を空のままにしておきます。
また、そのページのトリガーは「決定ボタン」とします。
イベントID:010の他の既存のページは、出現条件から「時間帯変化済み」を外して元の出現条件に戻します。
そうすると、「時間帯変化済み」スイッチがONの間は、イベントID:010は実質空のイベントとなり、
「時間帯変化済み」スイッチがOFFになると一度だけ並列処理が動いて、その後に再びスイッチがONになります。

案が二通りありますので、どちらかを選択して下さい。

また「一時セルフスイッチプラグイン」を導入済みの場合は、セルフスイッチの方が楽かもしれません。
マップに入ったときの最初の色調変化を自動でできます。
jaja
記事: 144
登録日時: 2015年12月30日(水) 17:47

Re: 並列処理の重さをどうすればよいのか

投稿記事by jaja » 2019年2月16日(土) 22:38

seeaさんの提案いただいた2つの案、やって見る前にお聞きしたいんですが
つまり提案いただいている事というのは
並列処理に無駄な処理をさせないため末尾まで実行内容を実行させた後は空のイベントに移行させ
無駄な事を避けさせるというコンセプトでしょうか?
アバター
seea
記事: 84
登録日時: 2016年6月04日(土) 21:48
連絡を取る:

Re: 並列処理の重さをどうすればよいのか

投稿記事by seea » 2019年2月16日(土) 22:49

はい。その通りです。
jaja
記事: 144
登録日時: 2015年12月30日(水) 17:47

Re: 並列処理の重さをどうすればよいのか

投稿記事by jaja » 2019年2月16日(土) 23:05


seeaさん、アドバイスいただきありがとうございました。まず自分でやってみて体感してみます。
どれぐらい、かかるかわかりませんので、こちらの返事は遅れるかもしれません。


それと紹介いただいた一時セルフスイッチプラグイン。検索かけましたらトリアコンタンさんの
プラグインSelfSwitchTemporary.jsがヒットしたのですが。こちらのことでしょうか? 


ひとまず、並列処理が何度も動いていないか確認してみて下さい。

こちらなんですが、つまりFPSを監視せよという事でしょうか?


問題は、普通にプレイ中に時間経過により時間帯が変わってしまったときです。
スイッチ切り替えのために別の並列処理を用意すると、キリがないというか本末転倒なので、
できればその処理はイベントコマンドではなく、スクリプト(プラグイン)側に入れたいですね。
ゲーム内時間の導入プラグインの内部でスイッチをOFFにできると、もっとも軽い仕組みになります。

この言葉の意味がまだわかってなくて本当は
seeaさんの提示してくださったやり方を終えてからお聞きしたいんですが
普通にプレイ中の時間経過というのは
ゲームを放置していても時間がたつ時間自然加算の事をおっしゃってますか?
(色々あって現在私は自然加算をあきらめ。場所移動での時間経過に限定しています)
アバター
seea
記事: 84
登録日時: 2016年6月04日(土) 21:48
連絡を取る:

Re: 並列処理の重さをどうすればよいのか

投稿記事by seea » 2019年2月16日(土) 23:34


承知いたしました。解決できると良いですね。
私のことはお気になさらず。返信も任意です。


はい。そうです。
スイッチではなくセルフスイッチを制御に使う場合は、セルフスイッチの自動リセットができるので
便利かもしれません。
これまでのお話の内容から予想すると、セルフスイッチを制御に使う仕組みは逆に複雑でややこしいと思いますので
セルフスイッチ案は無視してください。


FPSの監視ではないです。説明が不足しておりました、申し訳ありません。
重くなった原因の切り分けのための操作です。できれば一番最初にこの工程を行ってください。
確認方法は次の通りです。

並列処理イベントの実行内容のどこかに「文章の表示」コマンドを一つ、追加してください。
(何でもよいので、何か文章を書いておいてください)
ゲームのテストプレイのとき、その文章が表示されると思います。

〈結果1〉文章が表示されたウィンドウを閉じても閉じても何度も表示された場合(キャラを動かせない状態)
→ 並列処理が何度も動いている証拠ですので、
その並列処理イベントが重くなった原因の可能性があります。
スイッチを用いて並列処理を何度も動かさないための対処が有効です。

〈結果2〉文章が表示されたウィンドウを閉じたら以降は表示されなかった場合(一度だけ表示された場合)
→ 並列処理イベントは重くなった原因ではないということが分かります。

切り分けが終わりましたら、追加した「文章の表示」コマンドは不要ですので消してください。
おそらく〈結果1〉ではないかと予想をしていますが、
〈結果2〉だった場合は、並列処理を何度も動かさないための対処は不要ですので、それらの対策は無駄な対策になってしまいます。


はい。プレイ中の時間経過は、ゲームを放置していても時間がたつ時間自然加算のことを意味します。
しかし、お話の内容から、場所移動での時間経過に限定とのことですので、杞憂でした。
プラグイン側の改造は不要でしょうし、特に懸念点は無いです。


重くなった原因の切り分けで〈結果1〉で、かつ「並列処理を何度も動かさないための対処」を試みても
重さが改善しなかった場合は、並列処理が原因ではなく、TerraxLighting自体の重さである可能性が高いと判明します。
もしそうなりますと出来ることは限られていて、マップを小さくするか、光源の数(ライトの数)を減らしていく等の対策になります……。

“MV:質問” へ戻る