現在スマホ向けゲームを開発中です。
メインパソコンでは60FPSでサクサク動くのに、iPadだと20FPS前後しかでないマップがあって負荷の軽減に迫られました。
ブラウザでゲームを実行し、Chromeの開発者ツールを使うと負荷が高い処理を見つけやすかったので、方法をご紹介します。
用意するもの
- レンタルサーバー
- FTPソフト
- Google Chrome
わたしはブログをやるのに有料のレンタルサーバーを借りてますが、XFreeなどの無料のレンタルサーバーでもたぶん大丈夫なはず。
重い処理に検討をつける
RPGツクールMVで処理が重くなるのは、プラグインが原因のことが多いです。
まずはRPGツクールからテストプレイをし、だいたいどのタイミングで重くなるのかチェックします。
なるべく低性能のパソコンを使った方が見つけやすいです。
テストプレイだけだとわからない場合は、プラグインをぜんぶOFF→プラグインを1つずつONにしていってどの段階で重くなるのか確認し、だいたいの検討をつけます。
今回はプレイヤー探索プラグインで探索開始状態になっていると重くなることがわかりました。
DevToolsで負荷を計測する
Google Chromeには開発者向けツール(DevTools)がついており、パフォーマンスの計測ができます。
そこでレンタルサーバーにゲームデータをあげて、ブラウザでゲームを実行しながら負荷を計測します。
RPGツクールMVでウェブブラウザでデプロイメントし、レンタルサーバーにFTPでアップロードします。
アップロードした先にChromeでアクセスし、ゲームを開始します。
F12キーを押すと開発者ツール(DevTools)が開きます。
Performanceタブを開き、●ボタンで記録開始します。
記録中もゲームの操作はできるので、てきとうに移動したりメニューを開いたりします。
stopボタンを押して記録終了です。
計測結果を確認する
FPSやCPUの使用率などが表示されます。
FPSがさがってガクガクになっていると、FPS欄に赤いマークがつきます。
下のSummaryタブには、CPU負荷の内訳が円グラフで表示されます。
Scripting(Javascriptの処理)がほとんどを占めているようです。
Bottom-Upタブから、処理ごとにかかった時間が確認できます。
Self TimeとTotal Time欄にかかった時間、Activity欄に呼び出された処理名とその処理が書かれているファイル名が表示されます。
今回はプレイヤー探索プラグインが重いのでMKR_PlayerSensor.jsの中で負荷の高い処理を見ていきます。
項目名をクリックすると、昇順・降順が切り替えられるので、Self Timeの降順(多い順)にしてみました。
プレイヤー探索プラグイン関連だと、以下の処理がTotal Timeが多く、時間がかかっているみたいです。
- CEC
- Game_CharacterBase.isMapPassableEx
- Game_Event.rangeSearch
- getRegionIds
プラグインのファイルを開いて実際に処理をみてみると、重くなっているメソッドからCEC関数を呼び出していました。
つまり、CEC関数が重いためにCEC関数を呼び出しているメソッドも重くなっているといった感じですね。
CEC関数の内容を確認すると、配列から値を取り出しています。
ふつうプラグインパラメーターを受け取るとき、変数 = パラメータの値というように、変数値を入れておきます。
プレイヤー探索プラグインの場合、値だけではなくデータ型の種類や最小値などの情報も含めて配列として変数に入れているようです。
変数 = [値,データ型種類,デフォルト値,最小値,最大値]みたいな感じ。
実際の処理で値を使うときにCEC関数で値だけ取り出している、と。
そこまでリッチに管理する必要はないかなと考えて、CEC関数を使わないように修正をしました。
再度計測してみると、FPSがだいぶ改善され、CPUの負荷も下がっています。
内訳もScriptingが減ってIdle(待機中)が増えました。
重かったisMapPassableExは7854.3ms→1564.0ms、rangeSearchは4297.6ms→915.8msと約5分の1の処理時間になりました。
iPadでも確認したところ、20~25FPSだったのが35~50FPSくらいに軽くなりました。
FPSにムラがあるのは気になりますが、だいたい40FPSくらいになったので、ひとまずはよしとします。
まとめ
今回はブラウザでのテストプレイがいい感じでした。
サーバーにファイルアップロードしておけば、パソコンからもスマホからも手軽にテストプレイできるのがいいですね。
ただしキャッシュを無効にしておかないと、ファイルを更新しても反映されないので注意です。
わたしはこちらのページを参考に、.htaccessファイルでキャッシュを無効化しています。
→ホームページの更新をすぐ反映させる方法
しかし20FPSしか出ていなかった改善前でも、iPadのCPUやメモリにはかなり空きがあったんですよね。
Xcodeで計測したところ、CPU使用率5%(空き70%)、メモリ使用量17.3MB(空き378.8MB)くらい。
空いているCPUやメモリも使えばもっとFPSがあがるんじゃないかと思うんですが、その辺は今後の課題にしておきます。