2016年10月2日日曜日

コアスクリプトのver1.3.1ではウィンドウカラーを変更すべきでないという話

ver1.3.1ではウィンドウカラーを変更すべきでないという話

 RPGツクールMVのver1.3.1が公開されてからしばらく経ちました。描画エンジンのバージョンアップに伴い、パフォーマンスやメモリ問題について改善された部分はたくさんありますが、一方で新たな問題も散見されていて、私の元にもパフォーマンスについてご質問、ご相談を寄せられる機会が増えてきています。

 正直に言うと、私のプラグインが1.3.1に最適化されていない部分も多々ありまして、それも含めて対応可能な箇所は対応を進めているところです。

 その調査過程で見付けたのが、「ウィンドウカラーを変更すること」によるリスクです。ウィンドウカラーはデータベースの「システム」もしくはイベントコマンドで変更できます。しかし、結論から言うと少なくともver1.3.1ではカラーは0,0,0から変更しない方が無難と言わざるを得ないのです。

ウィンドウカラー変更

 まずは、以下の測定結果をご覧ください。

測定結果

 パフォーマンス調査にあたり、様々なタイミングやフレーム更新に掛かる時間を測定するプラグインを作成(ブログの最後で紹介しています)して、それを利用して測定しています。ゲームを起動して、以下の手順で操作を実行しました。

  1. ゲーム起動
  2. ニューゲームを選択
  3. メニュー画面を開く
  4. スキル画面を開く
  5. 3.と4.を繰り返す

 これらの動作を条件を変更して合計三回、実施したのが以下の表になります。すべてWebGLモードで計測プラグイン以外は適用していません。

  1. v1.3.1でウィンドウカラーをデータベースから変更している。
  2. v1.3.1でウィンドウカラーをデータベースから変更していない。
  3. v1.2.0でウィンドウカラーをデータベースから変更している。

ウィンドウカラー変更の有無による処理時間の違い

v1.3.1(変更あり) v1.3.1(変更なし) v1.2.0(変更あり) 計測対象
12.8MS 17.8MS 12.2MS シーン遷移 to Scene_Boot
46.7MS 59.9MS 44.3MS シーン遷移 to Scene_Title
214.8MS 210.2MS 185.9MS 背景キャプチャ作成
216.1MS 211.4MS 187.1MS シーン遷移 to Scene_Map
111.4MS 65.6MS 111.5MS マップ表示オブジェクト作成
69.2MS 68.4MS 38.1MS 背景キャプチャ作成
130.8MS 103.1MS 115.2MS シーン遷移 to Scene_Menu
129.7MS 78.6MS 108.1MS シーン遷移 to Scene_Skill
60.9MS 22MS 71.3MS シーン遷移 to Scene_Menu
127MS 69.2MS 142.3MS シーン遷移 to Scene_Skill
59.4MS 22.3MS 42.7MS シーン遷移 to Scene_Menu
107.3MS 62.1MS 158.2MS シーン遷移 to Scene_Skill
62.9MS 21MS 94.7MS シーン遷移 to Scene_Menu
100.8MS 32.3MS 135.8MS シーン遷移 to Scene_Skill
49.4MS 19.5MS 54.9MS シーン遷移 to Scene_Menu
114.2MS 31.1MS 103.7MS シーン遷移 to Scene_Skill

 ウィンドウカラーの変更が存在する場合、メニュー画面からスキル画面への遷移がおよそ60ミリ秒ほど遅延しているのが分かると思います。60ミリ秒とは0.06秒なので大きな影響はないように思えますが、実際に動かしてみると(スペック次第ですが)体感できるほどのカクツキを感じられるはずです。
 とはいえ、ウィンドウカラーの変更で時間が掛かっているのはv1.2.0も同じ。問題はここからです。

処理時間の違い(遷移を繰り返した場合)

v1.3.1(変更あり) v1.3.1(変更なし) v1.2.0(変更あり) 計測対象
287MS 31.7MS 130.1MS シーン遷移 to Scene_Skill
117.2MS 41.6MS 56.4MS シーン遷移 to Scene_Menu
174MS 35.4MS 151.1MS シーン遷移 to Scene_Skill
123.8MS 36.7MS 86.9MS シーン遷移 to Scene_Menu
221.2MS 31.8MS 133MS シーン遷移 to Scene_Skill
123.9MS 45.1MS 90.1MS シーン遷移 to Scene_Menu
264.5MS 78.3MS 115.1MS シーン遷移 to Scene_Skill

 何度も画面遷移を続けていくと差が広がっていき、酷いときでは200ミリ秒を上回る差異となっています。こうなるとカクツキは深刻です。長時間プレーしていると何度もメニューを開いたり閉じたりするので、イヤでも体感することになると思います。(ただし、メモリ上はおかしな点は見当たらないので根本原因については不明です)

考察と対策

 ウィンドウカラーを変更した場合、ウィンドウを作成するたびに「Bitmap.prototype.adjustTone」という処理が呼ばれますが、どうやらこれが元凶のようです。カラーを変更しない場合はもちろん呼ばれません。前述のとおりウィンドウは、画面遷移するたびに作り直されるので、戦闘→マップ→メニューと遷移を繰り返していけば処理の低下は避けられません。

 当然のことながら、プラグインによってメニュー画面に立ち絵や独自のウィンドウ等を追加すると、それに応じてさらにパフォーマンスが低下します。私が実際に確認したケースでは400ミリ秒を超えるケースもありました。

 すでに述べたとおり、対策は 「長編作品ではウィンドウカラーを変更しないこと」 です。もちろん今後の本体バージョンアップにより状況が改善されることは期待できますが、それでもカラーを変更することによって余分な処理が実行されることは避けようがありません。カラーの変更は手軽で便利ですが、ペイントソフトを使えば比較的簡単に色調を静的に変更できます。

 ただでさえ、パフォーマンスについて懸念点の多い現状ですから、できるところから対策していきたいですね!

プラグインの配布

 今回、パフォーマンス測定のために作成したプラグイン「パフォーマンス計測プラグイン」をMITライセンスで配布します。自作品のパフォーマンス改善の手掛かりにご利用頂ければと思います。詳細は以下の通りです。

処理に掛かる時間を計測してログに出力します。
正確な結果を計測するため、このプラグインは一番下に配置してください。
(このプラグインより下に配置されたプラグインの処理内容が計測時間から漏れる可能性があります)
ログが出力されるタイミングは主に2通りです。
 
1.フレーム更新ログ
1フレームに掛かる時間を計測します。出力内容は指定された間隔ごとの平均値です。
また、ゲーム更新と描画の時間を分けて出力することも可能です。
平均値が指定された閾値を超える場合、警告ログになります。
頻繁に警告ログが出力されなければ、概ね快適なプレーであるといえます。
 
2.その他ログ
同期実行され、かつ時間の掛かる以下の処理の時間を計測します。
・シーン遷移時
・マップオブジェクト作成時
・キャプチャ取得時
・セーブ実行時
 
結果が指定された閾値を超える場合、警告ログになります。
頻繁に警告ログが出力されなければ、概ね快適なプレーであるといえます。
 
パフォーマンス改善の手掛かりにしてください。
テストプレー時以外も動作しますが、製品版には付属しないことを推奨します。
 
このプラグインにはプラグインコマンドはありません。

ダウンロード

プラグインファイルはGithubで公開しています。
https://raw.githubusercontent.com/triacontane/RPGMakerMV/master/PerformanceRefine.js

ダウンロード方法(Windowsの場合)

  1. リンク先に飛ぶ
  2. 右クリック
  3. 名前を付けて保存
  4. ファイル名を変えずに、プロジェクトの「js/plugins」配下に配置

利用規約

当プラグインはMITライセンスのもとで公開されています。作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等)についても制限はありません。このプラグインはもうあなたのものです。
http://opensource.org/licenses/mit-license.php

2 件のコメント:

  1. お初にお目にかかります
    最近MVでの制作を始めたものです

    こちらのプラグインには大変お世話になっておりますが、
    トリアコンタン氏の仕事っぷりには頭が下がりっぱなしです
    まさかこんな問題もあるとは・・・

    こういう制作上での障害になりそうな事象を発見して頂けるととても大変助かります
    これからもプラグイン制作頑張ってください!!応援しています!!!><

    返信削除
    返信
    1. こんにちは!
      プラグインのご利用、応援ありがとうございます!
      パフォーマンスについては懸念事項がまだありそうなので、私に分かる範囲で調査、情報公開していく予定です!

      削除

注: コメントを投稿できるのは、このブログのメンバーだけです。