WOLF RPGエディター(ウディタ)/バグ・エラー【サイトトップへ戻る】
■1フレームあたりの処理が500万回を越えました!
(更新:2024/05/09)


このようなエラーが表示されましたか?



ショートカット
■エラーの原因
■エラーの発生場所を確認
■処理数の調べ方
■エラー回避の対策
■補足


  
■エラーの原因

ウディタは60分の1秒単位(※)で処理されており、1回の処理を「1フレーム」と呼んでいます。
※ゲームの基本設定にある「ゲームの処理FPS」が「30FPS」の場合は「30分の1秒単位」になります。

この1フレームに処理できるコマンドの数が「500万個」と決められており、
500万個を超えてコマンドを処理しようとすると、このエラーが発生します。



1フレームの中で複数のイベントが同時に動いている場合は、
全てのイベントの処理数を合わせた合計処理数が500万個未満にする必要があります。



コマンド処理数は…
■変数操作: このEvのSelf0 = 0 + 0
の設定で「1個」増え…
■変数操作: このEvのSelf0 = 0 + 0
■変数操作: このEvのSelf1 = 0 + 0
■変数操作: このEvのSelf2 = 0 + 0
の設定で「3個」増えます。

そのため「500万個を越えました」のエラーは、
「変数操作」などのイベントコマンドを1フレームの中で500万個以上処理した事になります。



このエラーは「ループ処理」でよく発生します。
例えば以下のようなループ処理を設定するとエラーが発生します。

▼ループを終了させる設定が無いため、無限ループが発生
■ループ開始
|■
◇ループここまで◇◇

▼主人公のX座標が40未満の時に無限ループが発生
●ラベル地点「top」 <<<<<<<<<<<<<<<<<<<<<<<<★
■変数操作+: このEvのSelf0 = 主人公 の X座標(標準)
■条件分岐(変数): 【1】 このEvのSelf0 が 40 未満
-◇分岐: 【1】 [ このEvのSelf0 が 40 未満 ]の場合↓

|●ラベル「top」に飛ぶ >>>>>>>>>>>>>>>>>>>>>>>>>
|■
◇分岐終了◇



また起動条件を「自動実行」にして、ウェイトや停止する設定がない場合も、このエラーが発生します。

▼これだけの設定でエラーが発生




ループ処理では「ループ内のコマンド数×処理回数」の分だけ処理数が増えます。

例えば…
■回数付きループ [ 10 ]回(処理数:1回)
|■変数操作: このEvのSelf0 += 1 + 0(処理数:10回)
|■変数操作: このEvのSelf1 -= 1 + 0(処理数:10回)
|■(処理数:10回)
◇ループここまで◇◇(処理数:10回)
のような設定の場合は、処理数は「41」になります。

また…
■回数付きループ [ 10 ]回
|■回数付きループ [ 10 ]回
||■変数操作: このEvのSelf0 += 1 + 0
||■
◇ループここまで◇◇
|■変数操作: このEvのSelf0 = 0+ 0
|■
◇ループここまで◇◇
のように、ループの中にループが設定されている場合は、
見た目では大した設定で無くても、意外と処理数が増えてしまう事があります。



エラーで表示されるイベントIDは、エラーが発生したイベントIDになります。

例えば…
■コモンイベント[215]

起動条件:並列実行(常時)

■ループ開始
|■イベントの挿入[名]: ["特殊処理"] <コモンEv 216>
|■
◇ループここまで◇◇
のような設定の場合、エラーの原因は「コモン[215]が無限ループになっている事」になりますが、
エラーの表示は「イベント-1(コモン216)20行」などとエラーの原因ではないイベントを示す場合があります。

またエラーが発生した位置が「たまたま500万個目の処理数になっただけ」の場合もあります。

例えばイベントAとイベントBがあり、イベントAで「4999000」の処理数を実行した場合、
イベントBで「1000」の処理数を実行しただけで、エラーが発生します。

この場合は、イベントBではなく、イベントAの方を改善する必要があります。


▲トップへ戻る▲


  
■エラーの発生場所を確認

エラーの表示を見て「エラーがどこで発生しているのか」を確認してください。



「処理地点」と書かれているのがエラーが発生している場所になります。
※デバッグウィンドウでも処理地点の確認ができます。

処理地点は右側から左に向かって読み取ります。

上図の場合は…
マップイベント[21]の1行目からコモンイベント[215]を呼び出し、
コモンイベント[215]の0行目からコモンイベント[216]を呼び出し、
コモンイベント[216]の1行目でエラーが発生。
となっています。


▲トップへ戻る▲


  
■処理数の調べ方

処理数を調べる場合は、システム変数[108:[読]現フレームのコマンド処理数]を使います。

【システム変数[108:[読]現フレームのコマンド処理数]の説明を見る】

▼設定例
■デバッグ文:処理数:\sys[108]



ループ処理がある場合は、そのループ処理の前後に処理数を調べる設定を行うと、
そのループの処理数を調べる事ができます。

■デバッグ文:ループ開始 \sys[108]
■ループ開始
|■〜何らかのイベントコマンドの設定〜
|■
◇ループここまで◇◇
■デバッグ文:ループ終了 \sys[108]



1フレームの間に実行する全ての処理数を調べる場合は、
コモンIDが最も大きいコモンイベントに以下のイベントを設定してください。

▼処理数の最大値が更新された時のみデバッグ文を表示
【イベントコード表示】

■コモンイベント「処理数確認」

起動条件:並列実行(常時)

■条件分岐(変数): 【1】 Sys108:[読]現フレームのコマンド処理数 が CSelf10[更新した処理数] 超
-◇分岐: 【1】 [ Sys108:[読]現フレームのコマンド処理数 が CSelf10[更新した処理数] 超 ]の場合↓
|■変数操作: CSelf10[更新した処理数] = Sys108:[読]現フレームのコマンド処理数 + 0
|■デバッグ文:処理数:\sys[108]
|■
◇分岐終了◇

下記の設定は[A]キーを押す事で、処理数の最大値の更新データが初期化され、
一から処理数の最大値を調べ直す事ができます。

【イベントコード表示】

■コモンイベント「処理数確認」

起動条件:並列実行(常時)

■キー入力:CSelf11[キーコード]キーボード(100〜) [キーコード[130]のみ判定] ( Aキー )
■条件分岐(変数): 【1】 CSelf11[キーコード] が 1 以上
-◇分岐: 【1】 [ CSelf11[キーコード] が 1 以上 ]の場合↓
|■変数操作: CSelf10[更新した処理数] = 0 + 0
|■デバッグ文の全消去
|■
◇分岐終了◇
■条件分岐(変数): 【1】 Sys108:[読]現フレームのコマンド処理数 が CSelf10[更新した処理数] 超
-◇分岐: 【1】 [ Sys108:[読]現フレームのコマンド処理数 が CSelf10[更新した処理数] 超 ]の場合↓
|■変数操作: CSelf10[更新した処理数] = Sys108:[読]現フレームのコマンド処理数 + 0
|■デバッグ文:処理数:\sys[108]
|■
◇分岐終了◇


▲トップへ戻る▲


  
■エラー回避の対策

エラーの回避方法としては、ウェイトを設定する方法があります。

▼設定例
●ラベル地点「top」 <<<<<<<<<<<<<<<<<<<<<<<<★
■変数操作+: このEvのSelf0 = 主人公 の X座標(標準)
■条件分岐(変数): 【1】 このEvのSelf0 が 40 未満
-◇分岐: 【1】 [ このEvのSelf0 が 40 未満 ]の場合↓
|■ウェイト:1 フレーム

|●ラベル「top」に飛ぶ >>>>>>>>>>>>>>>>>>>>>>>>>
|■
◇分岐終了◇

しかしウェイトを設定する事で、ウェイトを設定した分だけ処理速度が遅くなります。

出来る限りウェイトを実行したくない場合は、
システム変数[108:[読]現フレームのコマンド処理数]を使って現在の処理数を監視し、
500万個の処理数に近付いたらウェイトを実行すると良いでしょう。

▼処理数が残り10000未満になったらウェイトを実行
■条件分岐(変数): 【1】 Sys108:[読]現フレームのコマンド処理数 が 4990000 以上([データを呼ばない]にチェック)
-◇分岐: 【1】 [ Sys108:[読]現フレームのコマンド処理数 が 4990000 以上 ]の場合↓
|■ウェイト:1 フレーム
|■
◇分岐終了◇

ウェイトを実行するタイミングをあまりにギリギリに設定し過ぎると、
イベントの設定状況によっては500万個を超えてしまう事があるため、
イベントの設定状況を考慮して「4990000 以上」や「4500000 以上」などと多少余裕を持った設定にしてください。

なお、上記の残り処理数が少なくなったらウェイトを実行する処理は、
この設定自体も処理数を増やす要因になるため、
大量に設定したり、ループ回数の多い処理の中に設定するのは、お勧めできません。



ウェイト以外の設定方法として、処理Aと処理Bを交互に処理する方法もあります。

■変数操作: このEvのSelf0 += 1 + 0
■変数操作: このEvのSelf0 %= 2 + 0
■条件分岐(変数): 【1】 このEvのSelf0 が 0 と同じ 【2】 このEvのSelf0 が 1 と同じ
-◇分岐: 【1】 [ このEvのSelf0 が 0 と同じ ]の場合↓
|■〜処理A〜
-◇分岐: 【2】 [ このEvのSelf0 が 1 と同じ ]の場合↓
|■〜処理B〜
◇分岐終了◇

YADO作品の『病原体』では、敵となる病原体を3つのグループに分けて…
1フレーム目=敵グループAを処理
2フレーム目=敵グループBを処理
3フレーム目=敵グループCを処理

と処理して、処理数の増加を抑えていました。



イベントコマンドの設定方法を工夫して、処理結果を変えずに処理数を抑える方法もあります。

▼一括で設定
変更前(処理数:3) ■変数操作: このEvのSelf0 = 0 + 0
■変数操作: このEvのSelf1 = 0 + 0
■変数操作: このEvのSelf2 = 0 + 0
変更後(処理数:1) ■変数操作: このEvのSelf0〜このEvのSelf2 = 0 + 0

▼「変数呼び出し値」で設定
変更前(処理数:4) ■変数操作+: このEvのSelf0 = このマップイベント の X座標(標準)
■変数操作+: このEvのSelf0 -= 主人公 の X座標(標準)
■変数操作+: このEvのSelf1 = このマップイベント の Y座標(標準)
■変数操作+: このEvのSelf1 -= 主人公 の Y座標(標準)
変更後(処理数:2) ■変数操作: このEvのSelf0 = このEvのX座標(マップ) - 主人公のX座標(マップ)
■変数操作: このEvのSelf1 = このEvのY座標(マップ) - 主人公のY座標(マップ)
【イベントコード表示(マップ)】

▼ループの最後に「ループ開始へ戻る」を設定(ループ1回につき、処理数が1減る)
変更前(処理数:21) ■回数付きループ [ 10 ]回
|■
◇ループここまで◇◇
変更後(処理数:11) ■回数付きループ [ 10 ]回
|■ループ開始へ戻る
|■
◇ループここまで◇◇



イベントコマンドの【コメント文】【デバッグ文】なども処理数にカウントされるため、
特にループ処理の中には、出来る限り設定しない方が良いでしょう。


▲トップへ戻る▲


  
■補足

デバッグ作業が終わり…
■デバッグ文:処理数:\sys[108]
の設定を削除する場合は、コモンイベントの検索機能で「\sys[108]」の文字列を設定して、
コモンイベント全体を検索する事で、簡単にデバッグ文の設定を見つけ出す事ができます。



エラーの原因を探すために、デバッグ文を大量に設定したり、一時的に並列実行を停止したり、
部分的にイベントコマンドの設定を追加・変更・削除したりする場合は、あとで元に戻す作業が必要になります。
この元に戻す作業が不十分になってしまうと、新たなバグが発生する可能性があります。

元に戻す作業が大変になる場合は作品データを複製して、
その複製した作品データでデバッグを行うと、あとで元に戻す作業は不要になります。



処理数が「500万個未満」ならばエラーは発生しませんが、しかし毎フレームごとに数百万個の処理数になると、
パソコンの処理能力によっては、かなりの処理落ちが発生します。

そのため、エラーが発生しないからと言って、
毎フレームごとに大量のイベントコマンドを処理するような設定はお勧めできません。

なお「処理落ち状態」を体験したい方は、以下のイベントをコモンイベントに設定してみてください。

■コモンイベント

起動条件:並列実行(常時)

■回数付きループ [ 2000 ]回
|■回数付きループ [ 1000 ]回
||■
|◇ループここまで◇◇
|■
◇ループここまで◇◇


▲トップへ戻る▲

YADOT-WOLFトップ  気紛れな空間へ戻る  メール