【プラグイン】FastMZ 1.3 イベント処理全般を高速化します

うなうなぎ

ユーザー
とりあえず入れとくだけで速くなることを目指したプラグインです。
初期バージョンだとFastというほどは速くならなかったのですが、1.1でだいぶFastになりました。1.2でもう少しFastに。

# 動作確認用ゲーム​

FastMZ 高速化Demo - RPGアツマール

動作確認が出来るように、テストプログラムをRPGアツマールにアップロードしています。
実際に10万回ループなんてことは通常やらないと思いますが、個々の処理が軽くなることで、並列処理などで出来ることは格段に増えます。

プラグインの使い方​

基本的にはプラグインをRPGツクールMZ上で登録して、ONの状態にするだけです。
特にプラグインや画像表示以外の原因で重くなってるゲームなら効果を発揮します。
イベントの内容にもよるので、条件によっては100倍ぐらい速くなることもあるんですが、悪くても倍ぐらいは速くなるはずです。

まだ動作確認が不十分で、特に大規模なゲームで使った場合に、並列処理とかプラグインの競合とかで変な感じになるかもしれません。
その時はコメントなどいただければわかる範囲で直します。
(具体的にこのプロジェクトのここで変になるというのがわかると助かります)

依存プラグイン​

MZ用 基本機能ライブラリ Fs (β版) | ツクールフォーラム
1.1からはf-spaceさんのFs.jsを使わせてもらってます。
FastMZ.jsより上の位置に登録してください。

高速化した場所​

具体的には以下の3点を高速化しています。
  1. イベントコマンドの呼び出し(1.1から)
  2. 注釈コマンド(1.2から)
  3. フロー制御(条件分岐/ループ/ループの中断/ラベルジャンプ)
  4. イベントコマンド「スクリプト」(移動ルートのスクリプトも対応してます)

イベントコマンドの呼び出し​

1.1で追加。
イベントコマンドを呼び出しそのものを高速化しました。
毎回command+番号で検索していたのを、高速に探せるようにしました。
イベントを呼び出すたびに動く部分なので、基本どんなゲームにも効きますが、イベント数が多ければ多いほど効きます。

ただし、ゲーム中で関数を書き換えるような、イレギュラーな処理には対応できません。
具体的にはGame_System.initialize()の時点でprototypeに登録されていたcommand***を使います。

注釈コマンド​

注釈(コメント)は、ゲームの進行には影響を与えませんが、ゲームの”速度”には影響しています。
アツマールにあるデモで違いがわかると思います。
左下の2キャラに注釈を入れています。
100行の注釈があったとしても。片方はジャンプで飛ばして、片方は飛ばさない状態です。
(見た目の行数なので、1つの注釈に6行書いた場合も6つ分でカウントされます)

1.2での高速化によって、注釈が連続した部分は2回目以降無視出来るようになりました。
長い注釈ほど効果があるはずです。

かなり高速化はしましたが、それでも負荷が0にはなってないです。
イベントがそこを通るたびにちょっとだけ処理が入ります。
なのでどうしても速度が欲しい時は注釈文を消した方がいいと思います。

フロー制御​

コアスクリプトの実装だと、仮に100行のイベントを含んだループがあったとしたら、ループのたびに100箇所調べてループ開始地点を探すような仕組みでした。
FastMZでも1度目は同じように調べるのですが、2回目からは前回調べた場所に行くように変えています。

これによって、ループや条件分岐の中の行数が多いほど速くなっています。
ラベルジャンプに関しては、全体の行数も関係しています。

スクリプト処理の高速化​

スクリプトについてですが、いわゆるevalは使わずに、new Functionを使う実装に変えてみました。
利点としては、一度作った関数が使い回せるので、何度もパースしなくていいところです。
ただ互換性が完全ではないので、動かなくなるスクリプトがあるかもしれません。

結局の所やってることはevalと大差ないので、重めの処理はプラグインにして、プラグインコマンドで呼び出す方がいいと思います。


速度の計測​

Screenshot - 2021-01-31 16.59.23.png

全体的に高速化出来てるとは思うのですが、イベントの内容や環境による違いもあると思うので、どれぐらい速くなるのかわかりにくいです。

そこでFastMZTimer.jsで、測定用のプラグインコマンドを使えるようにしました。
ストップウォッチを押す感じで、測定開始して、何か重めの処理をやって、測定終了という感じです。
結果はツクール上のメッセージウィンドウで出るので、ユーザーに使ってもらったりするのにも便利じゅないかと思います。
(結果をメッセージ表示じゃなく、変数に記録するコマンドもあります)

ちなみにこの画面の「100万回変数に1を足し続ける処理」のテストプレイだと、通常だと2500ミリ秒程度かかるのが、FastMZの導入で800ミリ秒台になりました。3倍ぐらい速いです。
FastMZ1.0の段階でも1200ミリ秒ぐらいにはなっていたのですが、そこからさらに速くなりました。
イベントコマンドとフロー制御の高速化の両方が効いてると思われます。

ただ実際にはもっと速くなってます。

RPGツクールMZ側で、1フレームに10万回以上はコマンドが実行できない設定になってて、100万回ループだとその制限に引っかかちゃって、本来の速度を出しきれないようです。制限を緩めるともっと差が付きます。

それもあって、アツマール版では10万回までの設定に抑えています。実用上は1フレームで1000ぐらいのコマンドが使えれば十分だと思います。

計測に使ってるFastMZTimer.jsは、他のファイルとの依存関係はないので、関係ないプラグインやイベントの重さを調べるのにも使えます。
どっちの書き方が速いのか試したい時などに使って見てください。
ただ計測にはブレが出るので、何回か調べた方がいいです。他のソフトを終了させた状態の方が安定します。

変更点​

ver1.3 2021/02/03​

スクリプトからthisが使えるように修正しました。
イベントコマンドからだとGame_Interpreter、移動ルートからだとGaem_Eventになります。

ver1.2 2021/02/02​

RPGアツマールにデモンストレーション用のゲームを上げました。

注釈文があるだけで遅くなるのは嫌だったので、あまり遅くならないようにしました。
アクティブ状態の取得もちょっと効率化したつもりだけど、これはあんまり影響ないかも。
FastMZTimerのメッセージ表示も、デモ用にわかりやすくなるように調整。
あと英語版のアノテーションがおかしかったので直しました。

ver1.1 2021/01/30​

スクリプトやデータの扱いが雑すぎたので、Fs.jsを使う書き方に変えました。
データオブジェクトに変更を加えなくなったので、最適化がかかりやすくなってるはず。
速度測定用コマンドのFastMZTimer.jsも追加。
 

Attachments

  • FastMZ.js
    14 KB · 閲覧: 85
  • FastMZTimer.js
    3.8 KB · 閲覧: 26
最後に編集:
トップ