並列処理でスイッチや変数を操作すると重くなる【ツクールMV】

並列処理でのスイッチや変数の操作に注意

まず結論から書くと、並列処理イベントの中でスイッチや変数を操作すると処理に負荷がかかり動作が重くなります。しかもマップ中のイベントが多ければ多いほど負荷は大きくなっていきます。

というのも、イベントコマンド「スイッチの操作」や「変数の操作」「セルフスイッチの操作」を実行する度に、マップ上にある全てのイベントのページと全てのコモンイベントの状態をチェックし、操作の結果が各イベントページの出現条件に合致するかどうかを確認し、合致していればページをセットアップするという作業を行っているからです。これはスクリプトから「$gameSwitches.setValue()」を使って操作する場合でも同様です。

並列処理は1秒間に60回、毎フレーム繰り返し実行されていますので、その度に全てのイベントのリフレッシュが入るとなると、イベント数によっては油断できない負荷になってくる可能性があります。

しかし、プレイヤーの位置をリアルタイムで監視したい時など、並列処理で変数を扱いたい事はよくありますよね。

対策:スクリプトから直接データを書き換える

普通、スクリプトからスイッチや変数、セルフスイッチを操作する時は「.setValue()」を使うのですが、この方法だとイベントコマンドから操作するのと中身は変わりません。

なので、並列処理の中でスイッチや変数を扱いたい時は、実行内容にイベントコマンド「スクリプト」を設定して以下のようなコードを入力します。

//スイッチ1番をONにする
$gameSwitches._data[1] = true;
//変数1番に2を代入する
$gameVariables._data[1] = 2;
//マップID:1、イベントID:2のセルフスイッチAをONにする
$gameSelfSwitches._data[[1, 2, 'A']] = true;
//マップID:1、イベントID:2のセルフスイッチAをOFFにする
delete $gameSelfSwitches._data[[1, 2, 'A']];

このように「.setValue()」を通さず直接スイッチや変数の値を書き換えてみましょう。そうすれば、リフレッシュ処理を挟まずに値を操作する事ができます。

ただし、この方法は全イベントのリフレッシュ処理を省いている分、イベントの出現条件に設定されているスイッチ・変数を操作する目的には適しません。あくまで条件分岐の条件として利用するスイッチや、値を計算するための変数を操作したい時に使用するのが望ましいです。

なお、スイッチや変数の値を書き換えずに参照するだけなら(条件分岐に利用するだけなら)並列処理の中でもそれほど負荷はかかりません。

これらの点を踏まえて並列処理イベントを作ればゲームが重くなる事をある程度防げると思いますので、参考にしていただければと思います。