1. サイトトップ
  2. ブログ
  3. 【開発事例】キルラキル ザ・ゲーム -異布-(Switch版) ~グラフィック最適化編~

【開発事例】キルラキル ザ・ゲーム -異布-(Switch版) ~グラフィック最適化編~

こんにちは。
蟇郡みたいになりたい制作部プログラマの青柳です。

蟇郡 かっこいいですね!

今回は第一弾第二弾に続き
第三弾「グラフィックス最適化」編です。

1.今回の開発について

・開発の概要

今回の開発はグラフィックに関してはTRIGGER様監修のもとアークシステムワークス様、エープラス様がPS4などのプラットフォームを元に開発されていて、その途中で弊社がSwitch版開発を担当させて頂きました。

開発が進んで最終的なモデルのルックも決まっていたので「Switch版でもその見た目にする」という目標がまず立ちました。

・絵は出たけれど

開発においてはアークシステムワークス様、エープラス様謹製のフレームワークの力で案外素直に出てくれました、そう絵だけなら。
あるあるかもしれませんが最適化前の負荷はかなり高い状態でした。

2.負荷測定(最適化の際に一番重要な事)

という事で本題の最適化です。
最適化を行うぞ!と意気込む前にやることがあります。
表題の「負荷測定」です。

最適化の講演などではよく耳にしますが、 闇雲に最適化しても効果が見られなかったりして迷路に入ってしまう事はよくあります。

・どの処理に
・どのくらいの時間がかかっているか

を測定し、一番処理がかかっているところから対策していくのが王道で唯一の道です。

初めに
・CPU起因の負荷
・GPU起因の負荷
を切り分けます。
今回はGPU起因です。

GPUの描画だけの処理は大体以下のようになっています。

頂点フェッチ

VertexShader

GeometoryShader

ラスタライズ

PixelShader

Blendなど適用

またVertexShader、PixelShaderなどにはTextureフェッチの処理がかかることがあります。

最近のGPUプロファイラは便利で GPU起因の負荷がどの場所でどの程度か結構分かりやすく表示してくれました。
実際の画像は諸事情で貼れませんが大概のGPUProfilerには同じような機能が提供されていると思います。
今回の主な負荷は「頂点フェッチ」のステージで発生していました。

頂点フェッチ、、、
モデルを流し込むだけで詰まってしまうという事ですね。
アウトラインの押し出しで二回描画している部分もあるので更に倍。
という感じで辛いところです。

測定が大事!
とは言いつつ初めのうちはプログラムだけでどうにかなるところを初めにちくちく変更していました。
弄りやすいので、、、。
(RenderTargetのフォーマットを見直したり、Shader最適化でIf文をとったり、CPUで計算可能なところは変数にしてしまったりですね。
ここで印象深かったのは、最近のGPUはIf文に強いな、というのと
当然かもしれませんが、VertexShaderで使うUniformのパラメータを削ったりとかしてみてもあんまり変わらなかった事です。
結果はやはり劇的には変わりません。
試すことも試し
リダクションを検討する段階になりました。
ただ
「Switch版でもその見た目にする」
という目標がありますので、見た目に影響しない、ほぼ影響しないリダクションを考える事になります。

3.負荷削減の方法

長々と書いてきましたが頂点フェッチがボトルネックなら

・頂点の数を減らして流し込みを少なくする。
・頂点の1点当たりのデータを少なくして流し込みを少なくする。

が有効です。今回は下のデータを少なくする方法を採用しました。

例えば、

Position  : 32bit * 3
Color     : 32bit * 4
Normal    : 32bit * 3
UV        : 32bit * 2
boneIndex : 16bit * 4
boneWeight: 32bit * 4 
32bit * 16 + 16bit * 4 = 576

な頂点データを

Position  : 32bit * 3
Color     : 8bit  * 4
Normal    : 16bit * 3
UV        : 16bit * 2
boneIndex : 16bit * 4
boneWeight: 8bit  * 4 
32bit * 3 + 8bit * 8  + 16bit * 9 = 304

な頂点データにします。
(しますと言いつつエープラス様にコンバーターを作成して頂きました、エープラス様ありがとうございました)
Colorは 0~255 の精度が常ですし、
UV、Normalも精度的には16bitで十分。という理屈です。

また影のモデルもそこまで見た目に影響しない為、がっつりリダクションさせて頂きました。
具体的には頂点数90%減ほどに。

そんな工夫もあり、一部モードを除いて見た目にはほぼ同等程度の描画結果になったと思います。
相談に乗って頂いたアークシステムワークス様、エープラス様
弊社スタッフに感謝いたします。

ありがとうございました。

※カバーズチャレンジについてはどうしても難しく 解像度縮小などの変更を導入致しました。

4.終わりに

自分も含めて百戦錬磨、という面子ではありませんでしたが それぞれに助けられ、またチームメンバ以外の方の助けも借りて なんとか形になりました。

重ねてになってしまいますが、
関係会社様、チームメンバ、弊社スタッフに感謝いたします。
ありがとうございました。

今回の反省点はまた次のプロジェクトに生かします。

5.参考にさせて頂いたサイト、講演へのリンク

貴重な知見を公開して頂いているCEDECや他のサイト様にも格別の感謝を
ありがとうございます。

ひにけにGD様
古い記事ではありますが基本はこちらかなと思います
https://blogs.msdn.microsoft.com/ito/2010/05/24/05-gpu/

もっと詳しく知りたい方はこちらの資料を
CEDEC 2019 講演 GPU最適化:シェーダ実行の高速化手法
https://cedil.cesa.or.jp/cedil_sessions/view/2091

CEDEC 2016 講演 GPU最適化入門
https://cedil.cesa.or.jp/cedil_sessions/view/145


キルラキル ザ・ゲーム -異布-
© ARC SYSTEM WORKS / ©TRIGGER・中島かずき/キルラキル製作委員会


【免責事項】

本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。