プログラムこんにちは。今回は、処理削減と、計測方法についてまとめます。30fps=33.3msec)で処理が終わらないと「処理落ち」という状態になります。30fpsの動作になってしまいます。キャラクタの移動速度が半分になるので、非常にもっさりとした動きになります。複雑な処理も増えている昨今、どうやって処理を削減するのかまとめてみます。性能評価についてどれくらい処理を減らせばよいのでしょうか?これは、動作環境の性能評価を行って、各カテゴリのデータ制作作業が本格化する前に決めておきます。5%各カテゴリがこの中に収まるように見込みを立てます。ここでパーセント表記を使うと、プログラマ以外の職種の人にもわかりやすいです。「ソートに1000マイクロ秒もかかってる」と言われてもピンとこないのです。製品版には含まれないデバッグの部分などは別にカテゴリを用意しておいた方が、最終的に製品版に含まれない処理負荷が判ります。ボトルネックを探そう処理削減を行う際に、まず「どこがボトルネックになっているか?」を調べます。全体の50%の負荷がかかっている箇所を40%まで減らす事ができれば、10%の処理削減ができます。全体の1%の負荷がかかっている箇所を0.5%に減らしても、0.5%の処理削減にしかなりません。大きな負荷がかかっている箇所を減らす方が効果的です。調査は、現在では各プラットフォームで、ミリセカンド,ナノセカンド単位のタイマーを取得する事ができるので、それらを使って算出します。それらを実際のプログラムコードに入れて、計測を行います。やって測る事でキャラクタの処理負荷が判ります。これだけで大丈夫でしょうか?漏れがあると、どこで処理がかかっているのかが判らないので、ゲーム内の処理負荷をすべて計測します。キャラクタ処理,描画処理,ゲーム入力処理,エフェクト処理,サウンド処理...。ゲーム内のどんな処理が、どのくらいの負荷になっているかを計測します。例として、シネマティクスの会話シーンが重いとレポートがあり、調べてみると以下のような値である事が判りました。10%性能評価の見込み値と照らし合わせてみると、キャラクタカテゴリが想定よりも多くなっています。やって処理負荷を減らしましょうか?キャラクタ数を削る、などを提案してみましょうか?いやいやいや、まずはキャラクタのカテゴリの中身を更に詳細化しましょう。カテゴリを分けて調べてみると、以下の計測結果が判りました。20%当たり判定は重い事が多いですが、条件によっては行う必要がない時もあるので、ゲーム条件に合わせて検討を行ってみます。更新処理も結構大きな値です。ここも削減できるかどうか処理内容を調べてみましょう。したら、内部にデバッグコードが入っていて、それが原因で処理が増えているかもしれません。処理負荷削減に有効なのは上流工程です。いわゆる仕様部分ですが、同様にゲームの条件に合わせて、不要な処理を行わないようにすることで効果的に処理を減らす事ができます。今回の例で言えば、色々と調査していくと、そもそも会話シーンには当たり判定は不要ということが判りました。-20%が実現できました。プロファイラがあれば、それを使うのも手です。プロファイラは現在の処理の負荷が計測できるので、下流工程の処理削減に有効です。これで処理負荷を計測できるようになりましたが、ゲーム中様々なシーンで負荷は異なります。タイトル,チュートリアル,デモイベント,エンカウントなどなど。ゲーム中色々な場面で処理負荷を測りたいですよね。そのため、計測時にどんな挙動を行うかを指定できるようにして、自動計測を行います。具体的には、「ゲームを起動して、1ステージを開始して重いシチュエーションの所に移動して計測開始」などの挙動を指定できるようにします。ゲーム制作では、日々仕様や条件が変わるので、毎日計測しましょう。計測結果のレポート計測結果はjson形式などでファイルに出力しておきます。JavaScriptでグラフ表示を行うと判りやすくなります。動的に表示条件を変える事ができますが、詰め込むとページが重くなるので、レイアウトを工夫するか、casperJSなどの静的エンジンであらかじめレンダリングしておくと軽く表示できます。グラフも先にレンダリング画像を作っておくと表示が軽くなります。計測に問題が出たら巡回時に自動的にメールを送ってみましょう。チャットとかでも良いです。まとめ今回は処理負荷計測の詳細化と巡回計測について簡単にまとめました。実際にはGPU負荷も計測しますし、負荷以外のメモリ状況やキャラクタ詳細なども調べます。できるだけ人間の手間を減らして、クオリティアップに専念できるようにしていきましょう。