こんにちわ、Pocolです。
また、120fps対応しろと言われたら大変なので、どうやったっけ?
…というメモ書きを残しておこうと思います。
今回いう所の120FPS対応というのは、超強つよのPCではなく,いわゆる推奨スペックで120FPSを達成するやつで,他の会社みたいにぬるいやつじゃないのでご注意ください。
パフォーマンスバジェットですが,きついのはGPU側に大体なると思います。CPU側は有識者がいればなんとかなるし,CPU側はなんだかんで見れる人は多いはず。
GPU側はグラフィックスプログラマーの中でも,ちゃんと精通している人しかガチな最適化が出来ないということになりやすいです。で,最適化を頑張っても何ともならないなら、仕様的に削るに持っていくほかありません。
GPUパフォーマンスバジェットですが、ざっくりモデル描画で2ms程度に抑えないと,体感的に負け確定です。
1フレームを6.9ms~7.3ms程度に抑えるのが理想です。最低でもには7.9msぐらいに収まっていた方が安心できます。
そして、どうやって120fpsに持っていくか?ですが,ほぼ敵はモデル描画とアップスケールになるはずです。多分この二つが間違いなくボトルネックになります。
モデル描画の方は、とにかく書かないようするのと,シェーダの切り替えコストをできるだけ減らすようにします。シェーダハッシュ順とかでソートしてあげると,切り替えコストがかなり減ります。
続いて,アップスケールですが、こいつが重い。とくにかく重い。4kへのアップスケールとかやるとそら重い。…なので,できるだけアップスケールは最後に持ってくるようにして,そこまでのパスをまず縮小スケールで描くようにして,パフォーマンスをあらかじめ稼いでおきます。で、アップスケール自体が重いのは,これはもう命令を最適化するほかないです。できるだけ,16bit-floatを使った命令演算にするなどして,レジスタプレッシャーなどを減らします。16bitで行けるところは、できるだけ16bitにします。もちろんテクスチャデータ型などもです。AMDやNVIDIAであれば,16bit用のハードウェア専用命令があるので,こいつらを駆使してください。このあたりの最適化はシェーダに相当強いエンジニアと一緒に最適化していくと良いです。手元に実装時の資料無いのでうる覚えですが,アップスケールパスを 1.5ms程度に抑えないと,つらかったような気がします。当初は2.5msぐらいかかっていたかと。
モデル描画で 2ms, アップスケールで,1.5ms,おそらくライティングコストはそんなに変わらないので,1ms程度はかかるとすると,これで4.5ms程度です。残りの3msで,できる限りの処理に回します。
当然,非同期コンピュート使って処理時間を隠蔽できる箇所は,できるだけ非同期コンピュートを使うように駆使しまくります。
あとは,GPUプロファイラ使って,ハードウェアカウンターとにらめっこしながら,ボトルネックを解消していきます。
推奨スペックでの120fps対応は生半可な気持ちではできないので,強くアピールしたいものだけに労力を集中して,諦められるところは諦めて大胆な最適化をします。例えば,賑やかしのオブジェクトなどはゲーム体験に全く関わらないとし,全部表示しないようにするなどです。ここはアーティストの強い協力がないと達成できないので,二人三脚で乗り切る強い絆を事前に構築しておく必要があります。一緒に乗り越えるという形で作業を進めていけるように環境を整えましょう。
特定条件に応じたプログラムの最適化みたいなのは、かえってエンバグを起こしやすいので,最後にやるのはお勧めしません。出来るだけ、汎用的に効くものを優先した方が結果的に楽になります。
結構120fps対応はでかいところ真っ先につぶして,あとのちまちまして塵積となるやつを潰すという地味な戦いになるので,意外と持久戦になります。60fpsまでは,やることやればちゃんと速くなりますが,そこからネタが尽き,「どうにもならねー!!!」っていう苦悩との戦いになります。結局地味に積み重ねる他に手段はないです。
とにかく毎日プロファイルを取って、無駄なところを省いたり無くしていく。これに尽きます。
昨今は見た目よりも最適化が重視される時代です。どんなに見た目が良くても,どんなにキャラが魅力的でも,カクカクのクソ重い動作はユーザーに強い不快感を与えます。
最適化はプログラマーが頑張ればなんとかなるものでもありません。全員の協力が必要です。最適化に関して,理解あるチーム作りをできるように心がけましょう。
ゲームは総合芸術です。この総合芸術の中には最適化も含まれます。ゲームの総合力を上げて,魅力的なゲームをユーザーに届けましょう。
そして,そうすればきっと低評価もつかず,ユーザーの心も鷲掴みにできるはずです。