処理負荷削減と巡回計測について

こんにちは。下野です。

今回は、処理削減と、計測方法についてまとめます。

処理負荷削減とは

ゲームは60fpsまたは30fpsで動作させる事が多いのですが、それぞれのフレーム内(60fps=16.6msec, 30fps=33.3msec)で処理が終わらないと「処理落ち」という状態になります。

例えば 60fpsで処理落ちが発生すると 30fpsの動作になってしまいます。
キャラクタの移動速度が半分になるので、非常にもっさりとした動きになります。

複雑な処理も増えている昨今、どうやって処理を削減するのかまとめてみます。

性能評価について

どれくらい処理を減らせばよいのでしょうか?

これは、動作環境の性能評価を行って、各カテゴリのデータ制作作業が本格化する前に決めておきます。

こんな感じです。

  • 背景 30%
  • キャラクタ 20%
  • メニュー 5%
  • エフェクト 20%
  • サウンド 10%
  • その他 10%
  • デバッグ 5%

各カテゴリがこの中に収まるように見込みを立てます。

ここでパーセント表記を使うと、プログラマ以外の職種の人にもわかりやすいです。

「ソートに1000マイクロ秒もかかってる」と言われてもピンとこないのです。

製品版には含まれないデバッグの部分などは別にカテゴリを用意しておいた方が、最終的に製品版に含まれない処理負荷が判ります。

ボトルネックを探そう

処理削減を行う際に、まず「どこがボトルネックになっているか?」を調べます。

全体の50%の負荷がかかっている箇所を40%まで減らす事ができれば、10%の処理削減ができます。

しかし、全体の1%の負荷がかかっている箇所を0.5%に減らしても、0.5%の処理削減にしかなりません。

大きな負荷がかかっている箇所を減らす方が効果的です。

そのため、どこに想定よりも処理負荷がかかっているかを調べます。

処理負荷計測

処理負荷の調査は、現在では各プラットフォームで、ミリセカンド,ナノセカンド単位のタイマーを取得する事ができるので、それらを使って算出します。

それらを実際のプログラムコードに入れて、計測を行います。

例)

時間計測開始
キャラクタ処理
時間計測終了

こうやって測る事でキャラクタの処理負荷が判ります。

これだけで大丈夫でしょうか?

漏れがあると、どこで処理がかかっているのかが判らないので、ゲーム内の処理負荷をすべて計測します。

キャラクタ処理,描画処理,ゲーム入力処理,エフェクト処理,サウンド処理…。

ゲーム内のどんな処理が、どのくらいの負荷になっているかを計測します。

詳細に処理を計測

例として、シネマティクスの会話シーンが重いとレポートがあり、調べてみると以下のような値である事が判りました。

  • 背景 30%
  • キャラクタ 50%
  • メニュー 1%
  • エフェクト 20%
  • サウンド 10%
  • その他 10%
  • デバッグ 10%

性能評価の見込み値と照らし合わせてみると、キャラクタカテゴリが想定よりも多くなっています。

どうやって処理負荷を減らしましょうか?

キャラクタ数を削る、などを提案してみましょうか?

いやいやいや、まずはキャラクタのカテゴリの中身を更に詳細化しましょう。

更にカテゴリを分けて調べてみると、以下の計測結果が判りました。

  • キャラクタ – 更新処理 15%
  • キャラクタ – 骨計算 8%
  • キャラクタ – AI 2%
  • キャラクタ – 当たり判定 20%

当たり判定は重い事が多いですが、条件によっては行う必要がない時もあるので、
ゲーム条件に合わせて検討を行ってみます。

また、更新処理も結構大きな値です。ここも削減できるかどうか処理内容を調べてみましょう。

もしかしたら、内部にデバッグコードが入っていて、それが原因で処理が増えているかもしれません。

処理負荷削減に有効なのは上流工程です。

いわゆる仕様部分ですが、同様にゲームの条件に合わせて、不要な処理を行わないようにすることで効果的に処理を減らす事ができます。

今回の例で言えば、色々と調査していくと、そもそも会話シーンには当たり判定は不要ということが判りました。

なので、この会話シーンでは当たり判定を行わないようにすることで -20%が実現できました。

もちろんプロファイラがあれば、それを使うのも手です。

プロファイラは現在の処理の負荷が計測できるので、下流工程の処理削減に有効です。

そちらも併用してボトルネックを探り出していきましょう。

巡回処理負荷計測

これで処理負荷を計測できるようになりましたが、ゲーム中様々なシーンで負荷は異なります。

タイトル,チュートリアル,デモイベント,エンカウントなどなど。

ゲーム中色々な場面で処理負荷を測りたいですよね。

そのため、計測時にどんな挙動を行うかを指定できるようにして、自動計測を行います。

具体的には、「ゲームを起動して、1ステージを開始して重いシチュエーションの所に移動して計測開始」などの挙動を指定できるようにします。

それを更に進めて、ゲーム全体の処理負荷を計測して、一覧にしておいてくれるまでを自動実行すると更に便利ですね。巡回処理負荷計測です。

ゲーム制作では、日々仕様や条件が変わるので、毎日計測しましょう。

計測結果のレポート

計測結果はjson形式などでファイルに出力しておきます。

それを JavaScriptでグラフ表示を行うと判りやすくなります。

また動的に表示条件を変える事ができますが、詰め込むとページが重くなるので、レイアウトを工夫するか、casperJSなどの静的エンジンであらかじめレンダリングしておくと軽く表示できます。

グラフも先にレンダリング画像を作っておくと表示が軽くなります。

計測に問題が出たら巡回時に自動的にメールを送ってみましょう。

もちろんチャットとかでも良いです。

まとめ

今回は処理負荷計測の詳細化と巡回計測について簡単にまとめました。

実際にはGPU負荷も計測しますし、負荷以外のメモリ状況やキャラクタ詳細なども調べます。

できるだけ人間の手間を減らして、クオリティアップに専念できるようにしていきましょう。

ではまた。