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


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



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


  
■エラーの原因

ウディタは60分の1秒単位で処理されており、1秒間に「60フレーム」で処理しています。
※ゲームの基本設定にある「ゲームの処理FPS」が「30FPS」の場合は「30分の1秒単位」になります。
※処理落ちなどで1秒間に60フレームの処理が行われない事もあります。

そして1フレームごとにキー入力を処理したり、変数の値を変えたりしていますが、
この1フレームごとに処理できるコマンド処理数は「500万個」と決められており、
500万個を超えて処理しようとすると、「1フレームあたりの処理が500万回を越えました!」のエラーが発生します。



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

つまり…
■変数操作: このEvのSelf0 = 0 + 0
の設定を1フレームで500万回処理すると、エラーが発生する事になります。



基本的にイベントコマンド1個につき処理数が1増えますが、以下のイベントコマンドでは処理数の増加が異なります。

文字列操作 に↓のファイル内容読込 イベントコマンド1個につき、処理数+51
をファイル↓に出力 イベントコマンド1個につき、処理数+51
に↓のファイルをBase64ファイルで読込 イベントコマンド1個につき、処理数+51
から正規表現で置換 イベントコマンド1個につき、処理数+51
セーブ・ロード処理 変数・文字列の読み込み イベントコマンド1個につき、処理数+11
セーブデータへの(変数)書き込み イベントコマンド1個につき、処理数+11



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
|■
◇ループここまで◇◇
のように、ループの中にループが設定されている場合は、
見た目は少ない処理数に見えますが、実際にはかなり処理数が増えます。


▲トップへ戻る▲


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

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



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

上図の…
処理地点:【マップEv 24 コモンEv 216 行 3 】 <=[ Ev24 Common215 line1 <- Ev24 line0 ]
の場合は…
マップイベント[24]の0行目からコモンイベント[215]を呼び出し

コモンイベント[215]の1行目からコモンイベント[216]を呼び出し

コモンイベント[216]の3行目でエラーが発生
となります。

なお、エラーの内容やエラーが発生した場所を質問掲示板に書き出したい時には、
デバッグウィンドウに表示されているエラーの内容をコピーして、
それを質問掲示板に貼り付ける事で、簡単にエラーの内容を書き出す事ができます。



処理地点はエラーが発生した場所になりますが、必ずしも「処理地点=エラーの原因元」では無い事もあります。

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

■ループ開始
|■イベントの挿入[名]: ["特殊処理"] <コモンEv 216>
|■
◇ループここまで◇◇
と言った処理を実行して、エラーの表示が「処理地点:【コモンEv 216 行 3 】」であった場合、
エラー自体はコモンイベント[216]で発生していますが、
実際のエラーの原因はコモンイベント[215]が無限ループになっている事が原因になります。

またコモンイベント[215]の後にコモンイベント[216]を実行している場合で、
コモンイベント[215]で「4999000」の処理数を実行している場合は、
コモンイベント[216]の方で「1000」程度の処理数を実行しただけで、エラーが発生します。
この場合もエラーの発生場所はコモンイベント[216]になりますが、
実際のエラーの原因はコモンイベント[215]で大量のイベントコマンドを処理している事が原因になります。

このように「処理地点=エラーの原因元」では無い事もあるため、
エラーの原因を探るためには、エラーが発生したイベント以外にも目を向ける必要があります。


▲トップへ戻る▲


  
■コマンド処理数の調べ方

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

【システム変数[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]
|■
◇分岐終了◇



1つのループ処理の処理数など、特定の範囲の処理数を調べたい場合は、
特定の範囲の開始時と終了時の処理数の差分を出す事で、特定の範囲の処理数を調べる事ができます。

■変数操作: CSelf10 = Sys108:[読]現フレーム開始からのコマンド処理数 + 0
■ループ開始
|■〜何らかのイベントコマンドの設定〜
|■
◇ループここまで◇◇
■変数操作: CSelf11 = Sys108:[読]現フレーム開始からのコマンド処理数 - CSelf10
■デバッグ文:ループ処理の処理数:\cself[11]



なお、システム変数[108:[読]現フレーム開始からのコマンド処理数]の値は、ウェイトを実行すると「0」に戻るため、
もしもウェイトの設定がある場合で処理数を調べたい時には…
■デバッグ文:処理数:\sys[108]
■ウェイト:1 フレーム
と言ったように、ウェイトを実行する前に処理数を調べてください。


▲トップへ戻る▲


  
■エラー回避の対策

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

▼設定例
●ラベル地点 【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万個を超えてしまう事があります。
そのため条件分岐の設定は「4900000以上」や「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減る)
変更前(処理数:31) ■回数付きループ [ 10 ]回
|■変数操作: このEvのSelf0 += 1 + 0
|■
◇ループここまで◇◇
変更後(処理数:21) ■回数付きループ [ 10 ]回
|■変数操作: このEvのSelf0 += 1 + 0
|■ループ開始へ戻る
|■
◇ループここまで◇◇

▼条件分岐「1以上」を回数付きループ+ループ中断で代用(条件を満たす場合で、処理数が2減る)
変更前(処理数:5) ■条件分岐(数値): 【1】 このEvのSelf0 が 1 以上
-◇分岐: 【1】 [ このEvのSelf0 が 1 以上 ]の場合↓
|■変数操作: このEvのSelf1 += 1 + 0
|■
◇分岐終了◇
変更後(処理数:3) ■回数付きループ [ このEvのSelf0 ]回
|■変数操作: このEvのSelf1 += 1 + 0
|■ループ中断
|■
◇ループここまで◇◇

▼条件分岐「0と同じ」「1と同じ」をラベルで代用(条件を満たす場合で、処理数が4減る)
変更前(処理数:6) ■条件分岐(数値): 【1】 このEvのSelf0 が 0 と同じ 【2】 このEvのSelf0 が 1 と同じ
-◇分岐: 【1】 [ このEvのSelf0 が 0 と同じ ]の場合↓
|■変数操作: このEvのSelf1 = 0 + 0
|■
-◇分岐: 【2】 [ このEvのSelf0 が 1 と同じ ]の場合↓
|■変数操作: このEvのSelf1 = 10 + 0
|■
◇分岐終了◇
変更後(処理数:2) ●ラベルに飛ぶ 【値\self[0]】 >>>>>>>>>>>>>>>>>>>>>>>>>
■回数付きループ [ 0 ]回
|●ラベル地点 【値0】 <<<<<<<<<<<<<<★
|■変数操作: このEvのSelf1 = 0 + 0
|■ループ中断
|●ラベル地点 【値1】 <<<<<<<<<<<<<<★
|■変数操作: このEvのSelf1 = 10 + 0
|■ループ中断
|■
◇ループここまで◇◇

なお、上記で紹介している設定方法は、あくまでイベントコマンドを大量に処理する時に役立つテクニックであり、
イベントコマンドを大量に処理しない場合は、無理に設定する必要はありません。

逆に無理に設定しようとすると、設定内容が分かりにくくなって、設定ミスなどが発生しやすくなります。



イベントコマンドの【コメント文】【デバッグ文】などの設定も処理数にカウントされるため、
特にループ回数が多いループ処理の中に設定するのはお勧めできません。


▲トップへ戻る▲


  
■補足

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



エラーの原因を探すために、デバッグ文を大量に設定したり、一時的に並列実行を停止したり、
部分的にイベントコマンドの設定を変更したりする場合は、作品データを複製して、
複製した作品データでエラーの原因を探した方が良いでしょう。

複製した作品データならば、イベントを削除したりしても、あとで元に戻す作業が不要になります。



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

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

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

■コモンイベント【イベントコード表示】

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

■回数付きループ [ 1000 ]回
|■回数付きループ [ 1600 ]回
||■DB読込(可変): CSelf0 = 可変DB[ 0:0:0 ] (主人公ステータス:ヒーローさん:キャラ名)
||■
|◇ループここまで◇◇
|■
◇ループここまで◇◇


▲トップへ戻る▲

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