2019.10.10こんにちは。蟇郡みたいになりたい制作部プログラマの青柳です。かっこいいですね!今回は第一弾、第二弾に続き第三弾「グラフィックス最適化」編です。今回の開発はグラフィックに関してはTRIGGER様監修のもとアークシステムワークス様、エープラス様がPS4などのプラットフォームを元に開発されていて、その途中で弊社がSwitch版開発を担当させて頂きました。開発が進んで最終的なモデルのルックも決まっていたので「Switch版でもその見た目にする」という目標がまず立ちました。・絵は出たけれど開発においてはアークシステムワークス様、エープラス様謹製のフレームワークの力で案外素直に出てくれました、そう絵だけなら。あるあるかもしれませんが最適化前の負荷はかなり高い状態でした。2.負荷測定(最適化の際に一番重要な事)という事で本題の最適化です。最適化を行うぞ!と意気込む前にやることがあります。表題の「負荷測定」です。闇雲に最適化しても効果が見られなかったりして迷路に入ってしまう事はよくあります。・どの処理に・どのくらいの時間がかかっているかを測定し、一番処理がかかっているところから対策していくのが王道で唯一の道です。・GPU起因の負荷を切り分けます。今回はGPU起因です。GPUの描画だけの処理は大体以下のようになっています。頂点フェッチ↓VertexShader↓GeometoryShader↓ラスタライズ↓PixelShader↓Blendなど適用またVertexShader、PixelShaderなどにはTextureフェッチの処理がかかることがあります。GPU起因の負荷がどの場所でどの程度か結構分かりやすく表示してくれました。実際の画像は諸事情で貼れませんが大概のGPUProfilerには同じような機能が提供されていると思います。今回の主な負荷は「頂点フェッチ」のステージで発生していました。頂点フェッチ、、、モデルを流し込むだけで詰まってしまうという事ですね。アウトラインの押し出しで二回描画している部分もあるので更に倍。いう感じで辛いところです。測定が大事!とは言いつつ初めのうちはプログラムだけでどうにかなるところを初めにちくちく変更していました。弄りやすいので、、、。(RenderTargetのフォーマットを見直したり、Shader最適化でIf文をとったり、CPUで計算可能なところは変数にしてしまったりですね。ここで印象深かったのは、最近のGPUはIf文に強いな、というのと当然かもしれませんが、VertexShaderで使うUniformのパラメータを削ったりとかしてみてもあんまり変わらなかった事です。)結果はやはり劇的には変わりません。試すことも試しリダクションを検討する段階になりました。「Switch版でもその見た目にする」という目標がありますので、見た目に影響しない、ほぼ影響しないリダクションを考える事になります。書いてきましたが頂点フェッチがボトルネックなら・頂点の数を減らして流し込みを少なくする。・頂点の1点当たりのデータを少なくして流し込みを少なくする。今回は下のデータを少なくする方法を採用しました。304な頂点データにします。精度が常ですし、UV、Normalも精度的には16bitで十分。影のモデルもそこまで見た目に影響しない為、がっつりリダクションさせて頂きました。具体的には頂点数90%減ほどに。そんな工夫もあり、一部モードを除いて見た目にはほぼ同等程度の描画結果になったと思います。弊社スタッフに感謝いたします。ありがとうございました。解像度縮小などの変更を導入致しました。なんとか形になりました。関係会社様、チームメンバ、弊社スタッフに感謝いたします。ありがとうございました。今回の反省点はまた次のプロジェクトに生かします。5.参考にさせて頂いたサイト、講演へのリンク貴重な知見を公開して頂いているCEDECや他のサイト様にも格別の感謝をありがとうございます。株式会社ロジカルビートは一切の責任を負いません。