【RPGMV】ターン終了時が重いので調査しました

こんにちは~。
戦闘ターン終了時の動作がスマホでなんかやたらと重かったので、調査した内容を記述します。

■はじめに
Window_BattleStatus を継承してマップ上にステータスを表示させたら、スマホ上での動作が重かったため調査していたところ、戦闘ターン終了時の動作も重かったため追加調査した結果、同じ処理が重いことが分かった。

■原因と対処
戦闘ターン終了時の動作が重いのは、BattleManager.refreshStatus が過剰に呼ばれているから……と思われる。

この BattleManager.refreshStatus は Window_BattleStatus.prototype.refresh を呼び出しており、処理としては味方のステータスWindowの更新である。

以下の画像で、this.refreshStatus(); と書かれている箇所である。コメントアウト済み。
(その下の行は別件の私の都合でコメントアウトしてある)
これを見ると、battler(キャラクター1体) に対して forEach で繰り返し処理を行っているように見えるが、refreshStatus 処理は全員分のステータス表示を更新するため、1回やれば済むはずである。
よって、forEach外に処理を置くべきと考える。

endTurn.png

今回は、パーティコマンド入力前に行っている refreshStatus 処理にお任せする事にして、コメントアウトしている。

尚、refreshStatus 処理は、BattleManager 内で他にも何か所か呼ばれており、その中にも必要なさそうな箇所がある。
ただし、ツクールMVの全機能について確認したわけではないため、本当に必要ないのかは未確認。

■おわりに
今回は、refreshStatus を呼ぶ回数を減らす事で対処したが、refreshStatus 処理自体がある程度重い処理である模様。
また、私の自分用プラグインには反映させているが、検証不足のためプラグインとして公開していないし特に公開する予定もないので、ご了承ください。

以上、よろしくお願いします。
 
こんばんは。

2年前に書いた『RPGツクールMVでターン終了時の処理が重いので調査しました』という件ですが、この時書いてなかった情報があるので、追記します。

まず、BattleManager.refreshStatus() について、この処理は戦闘中、ターン開始、ターン終了、キャラクター行動時など何かある度に呼ばれています。
この中で、特にターン終了時のrefresh処理がループ内に入っている事から、ターン終了時の処理が重いという話をしました。

このrefresh処理を辿っていくと、Window_BattleStatus.prototype.refresh() が呼ばれていて、その中の drawItem() で、
drawGaugeArea() も呼ばれています。
これはHPゲージ等を表示する処理です。

その drawGaugeArea() をさらに辿ると、Window_Base.prototype.textColor という処理があります。

一見なんてことない処理なのですが、このtextColorは、色データを取得するために、Window.png に毎回アクセスしているようなのです。
そのため、このtextColorは意外と重い処理となっています。

このtextColor処理を軽減するプラグインも用意してます。
シングルトンのように初回時に変数にデータを持つようにします。
↓GitHub↓
https://raw.githubusercontent.com/kuroudo119/RPGMV-Plugin/master/KRD_Color.js

というわけで、RPGツクールMVの動作が重い件で悩んでいる方はお試しください。

ちなみに、前述のターン終了時のrefresh処理をなくすプラグインはコチラですが、併用してもさほど効果はないと思われます。
↓GitHub↓
https://raw.githubusercontent.com/kuroudo119/RPGMV-Plugin/master/KRD_Refresh.js

尚、RPGツクールMZではColorManagerという仕組みに変わっており、色データ処理は改善されているようなので、本件はRPGツクールMVの話となります。

よろしくお願いします。
 
トップ