Weitere ähnliche Inhalte Ähnlich wie UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER (20) Mehr von エピック・ゲームズ・ジャパン Epic Games Japan (20) UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER2. #ue4fest
角田 高宏
• チーフプログラマー
• 2013年 入社
• アーケード、コンシューマ、モバイル
と幅広くタイトルを経験
• グラフィックプログラムと最適化を担
当することが多い
• 『ニンジャラ』ではパフォーマンス最
適化を担当
江原 崇将
• チーフデザイナー
• 2016年 入社
• デザイナサポート、マテリアル検証
アセット管理、機材調整、PV撮影など
幅は広いが底は浅い。
• 『ニンジャラ』ではテクニカルアーテ
ィストとしての役割を担う
自己紹介
3. #ue4fest
対応ハード : Nintendo Switch
ジャンル : 対戦ニンジャガムアクション
最大8人のオンライン対戦に対応
基本プレイ無料
対応言語 : 日,英,仏,伊,独,西,中(簡体/繁体),韓
2020年6月25日からサービス開始
UE4 Version : 4.24.2
ニンジャラとは
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
4. #ue4fest
• Nintendo Switch で
60fps で動作しています
今回はここにフォーカス
した話をします
ニンジャラとは
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
7. #ue4fest
• 要件
• 描画の基本設定
• UE4×Switchのパフォーマンスについて
• 最適化
• アセット
• 実装
• ビルド設定
• エンジン改造
• 対応しなかったもの
• まとめ
アジェンダ
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
14. #ue4fest
• Switch で ThirdPersonTemplate を動かしてみた
UE4×Switchのパフォーマンスについて
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
17. #ue4fest
• DefaultLitマテリアル と UnLitマテリアル
• UE4のマテリアル
・ライティングするもの ( DefaultLit )
・ライティングしないもの ( UnLit )
乱暴に分けると、この2種類に分けられる
• Switch上でのパフォーマンスを比べてみた
UE4×Switchのパフォーマンスについて
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
18. #ue4fest
• DefaultLit と UnLit の比較 (720p)
• カメラとPlane,Directional Light を1つずつ配置
UE4×Switchのパフォーマンスについて
GPU 4.36 ms GPU 0.82 ms
DefaultLit UnLit
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
19. #ue4fest
• DefaultLit と UnLit の比較 (720p)
• ノーマルマップ有 / UnLitにシェーディングを追加
UE4×Switchのパフォーマンスについて
GPU 4.65 ms GPU 1.15 ms
DefaultLit UnLit +
Fake Shading
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
24. #ue4fest
• Forward Rendering
• 単純にパフォーマンスが Forward の方が良かった
• Deferred でしか使えないポストエフェクト(SSR、SSAO等)
は負荷の点から使用しない方針にした
描画の基本設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
25. #ue4fest
• 解像度
• コンソールモード 1080p~810p
• ハンドヘルドモード 720p~540p
の可変解像度(100%~75%)
UE4.19 から入っている DynamicResolution を使用
UIの解像度は100%固定
E3 2018、TGS 2018 版は、720p (コンソールモード)、480p (ハンドヘルドモード)
描画の基本設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
26. #ue4fest
• Light
• Movable Light
• バトル中は未使用
• Stationary Light
• Directional Light 1本に限る
• ダイナミックシャドウを落とすのはこれ1本
• Static Light
• 上記以外のLight全て
• Static な Lightは「Actor Hidden In Game」 を有効にしておく
• ランタイムで影響チェックが行われ、CPU負荷の原因になる為
描画の基本設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
27. #ue4fest
• ポストプロセス
• Bloom
• AutoExposure
• Color Grading
• FXAA
• Fog
• ExponentialHeightFog
• AtmosphericFog は負荷が大きかった
描画の基本設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
28. #ue4fest
• テクスチャフィルタ
• 拡縮、ミップマップ共にバイリニア
• 異方性フィルタは未使用
• 使用の有無で1ms ほど負荷に差
• Mask Material only in Early Z-pass を有効に
• Maskedマテリアルを多用している為
• Epicの篠山さんによる「Mask Material only in Early Z-pass」の解説
https://www.slideshare.net/EpicGamesJapan/mask-material-only-in-early-zpass
描画の基本設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
31. #ue4fest
• スペック
• 約11000ポリゴン
• 平均的な物で26ボーン
• パーツ数(10個くらい)
• LOD
• 3段階
• リムライト、レフライト、目専用、色変え等
• マテリアルは平均的な物で10個使用
• パフォーマンスの目安
• 1.0 ms / キャラ
アセットの最適化 キャラクター
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
37. #ue4fest
• 専用の影モデル
• Hidden Shadow + PoseableMeshComponent を使い、
ボーンのTransform情報を、影メッシュにコピーして使用
アセットの最適化 キャラクター
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
38. #ue4fest
• 対策前後の負荷比較
この例では 1.5 ms 以上高速化
アセットの最適化 キャラクター
GPU 9.53 ms GPU 7.87 ms
Before After
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
43. #ue4fest
• メッシュ
• 最適化の方針
• カリングを考慮して地面、遠景はステージ中央から放射状に分割
• 高さ方向に関しては、シビアに分割していない
アセットの最適化 背景
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
44. #ue4fest
• LOD
• 近景は最大4段階(基本は3段階)
• UE4標準のリダクション機能を使用
• 単にポリゴン数、頂点数の問題だけで無く、
表示距離 / 面積に応じた適切な頂点密度にすることが重要
頂点が密集しすぎると、マイクロポリゴンや OverDraw の原因にな
り、負荷が上がるため、頂点数が少ないメッシュでもLODを作る意
味はある
アセットの最適化 背景
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
46. #ue4fest
• マテリアル
• ほぼ UnLit の不透明 or Masked で構成
• UnLitマテリアル内で陰影付けをやっているものもある
• ガムは UnLit なパーティクル
• 動的光源を使わない
• ライトを発生させていない
アセットの最適化 パーティクル
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
54. #ue4fest
• 遮蔽物の向こう側のキャラが見える特殊表現
• Unlit のシンプルなマテリアル + VertexOffset で
カメラ方向へ頂点を引き寄せる方法で実現
• カスタムステンシル+ポストプロセスでの実装も
テストしたが負荷の面で断念
アセットの最適化 透視表現
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
56. #ue4fest
• 更新頻度の低いものは Invalidiation Box を使用
• ニンジャラのバトル中のUIの例
• Invalidation Box なし CPU 3~4 ms
• Invalidation Box あり CPU 1~1.5 ms
これくらい差が出る
アセットの最適化 UMG
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
57. #ue4fest
• アニメーションは可能ならマテリアルによる表現に変更
• パーツの Transform を変更するアニメーションは最小限に
• 階層を深くしない
• 階層が浅くても重ねると負荷が高いパーツもある
• 例) ScaleBox
• 汎用的なWidget BluePrint( WBP ) にして、その組み合わせで作りす
ぎると、想像以上に階層が深くなることがあるので注意
• 使い易さとパフォーマンスのトレードオフ
• Widget Reflector で状態を確認
アセットの最適化 UMG
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
60. #ue4fest
• ゲーム概要、要件
• 描画の基本設定
• UE4×Switchのパフォーマンスについて
• 最適化
• アセット
• 実装
• ビルド設定
• エンジン改造
• 対応しなかったもの
• まとめ
アジェンダ
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
63. #ue4fest
• バトルで使用するBPは、Tickの使用を禁止
• E3 2018, TGS 2018版のTickは全てC++のスクラッチ実装
• 当時は完全同期型の通信システムを採用しており、
標準のUE4には完全同期の通信システムがなかった
• 60fpsに近いパフォーマンスで動作していた
そこから、非同期型のシステムへ移行することになった為、
UE4の非同期通信の仕組みを取り入れる際、
パフォーマンスを担保するためにこのルールを適用
最適化 実装 実装ルール
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
65. #ue4fest
• StaticMesh として配置
• リアクション時に SkeletalMesh へ切り替えてアニメーション再生
• 影は思い切ってオミット
• ダイナミックシャドウは高負荷な上、配置数、密度が読めなかった
最適化 実装 リアクションのある配置物
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
67. #ue4fest
• カメラから遠いキャラの移動処理の頻度を下げる
• 35m 以上離れているキャラは 3フレームに1回
• SetRotation の呼び出し抑制
• 回転量の変化が一定閾値を超えない限り呼ばない
• SetActorLocation,SetActorRotation,SetActorTransform の呼び出し
は Overlap や ChildComponentTransform の更新処理が走り高負荷
最適化 実装 キャラクター
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
69. #ue4fest
• Spawnのタイミングをフレーム分散
• ヒッチ対策
• Tickでの検索処理( FindFunction や Actorの検索等 )の排除
• 気づかずに使われているケースが割とある
• プロファイルをかけると負荷上位に来るので比較的見つけやすい
• オブジェクトをプールしておいて使い回す
• 配置物やアイテムの動的生成を抑制
• 使っていないUMGは徹底的に Collapsed に設定
• Hidden だと 裏で処理は回るので Collapsed
最適化 実装 その他
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
70. #ue4fest
• ゲーム概要、要件
• 描画の基本設定
• UE4×Switchのパフォーマンスについて
• 最適化
• アセット
• 実装
• ビルド設定
• エンジン改造
• 対応しなかったもの
• まとめ
アジェンダ
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
72. #ue4fest
• メモリアロケーターに Binned2 を使用
• UE4.22から 標準は Binned3 だが、Binned2 に比べCPU負荷が高い
• UE4.22へ上げた直後は 2~3ms CPU負荷が増加
• UE4.24.2時点でも、1ms ほど負荷が高い
※ニンジャラのバトルシーンでの負荷
• メモリ使用量は Binned3 の方が少ない
• こちらで計測した結果だと、Binned3 の方が多いケースもあり
最適化 ビルド設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
73. #ue4fest
• Binned3 → Binned2 にする方法
• ニンジャラではTarget.cs に以下のコードを記述
最適化 ビルド設定
if (Target.Platform == UnrealTargetPlatform.Switch)
{
GlobalDefinitions.Add("USE_MALLOC_BINNED3 = 0");
}
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
74. #ue4fest
• PGO (Profile-guided optimization) の使用
• 実際のコードの実行のされ方によって
最適化を行ってくれる仕組み
• UE4のSwitchビルドも対応している
• ニンジャラのバトルシーンでは 1~3ms CPUが高速化
最適化 ビルド設定
非常に強力!
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
75. #ue4fest
• PGOの注意点
• どれだけ最適化が出来るのか予測が難しい
• トレーニングラン時のプレイの仕方や、その時点でのコードに左右される
• PGOをあてにしたパフォーマンス設計は危険
• ニンジャラでは、PGO無しでも 16.666ms に収まる状態まで
CPUを最適化し、少し余裕を持たせるくらいの感覚で使用
• ビルド(リンク)時間が長い
• プロファイルデータ収集用に専用のビルドを行う必要がある
• UE4.23 だと +1時間
• UE4.24 だと +15分
※ CPUがCore i7-8700kのマシンでの時間
最適化 ビルド設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
76. #ue4fest
• ニンジャラでのPGOの運用
• TestBuild でトレーニングラン(プロファイルの収集)
• プロファイルの書き出しにデバッグ用の機能を使ったため
• 本来は ShippingBuild でやるべき
• トレーニングランは人力
• 自動テストに組み込むのが理想
• 重点的に最適化したい箇所が明確な場合は、人力が有利かも
最適化 ビルド設定
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
79. #ue4fest
• カメラ位置と回転の取得の最適化
• APlayerCameraManager::GetCameraViewPoint の修正
• 上記の FMinimalViewInfo のメンバ FPostProcessSettings のコピーが高負荷
→ カメラ位置と回転を FMinimalViewInfo と分けてキャッシュ
• パーティクルシステムからの呼び出しが多数
• 全体の約50%
この修正で、1~2ms 高速化
最適化 エンジン改造
const FMinimalViewInfo CurrentPOV = GetCameraCachePOV();
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
80. #ue4fest
• TArrayをReserveするように対応
• ColorGrading の毎フレーム更新のスキップ
• VertexFog 時に VolumetricFog を参照しないように修正
• シェーダーに少し手を加えた
• AABB計算の最適化
• FKSphylElem,FKBoxElem の GetTransform() を使わずに、
キャッシュした Transform を使うように修正
最適化 エンジン改造
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
85. #ue4fest
• Precomputed Visibility Volume
• 空中戦、空中移動が多く、壁側面も歩けるので、不向き
• 仕様上、カメラがオブジェクトの中にめり込む可能性があるため、
その場合 Visibility がおかしくなる
• UMG の RetainerBox
• UE4.24で Transform の補正処理にバグがあり使用を断念
• issue番号:UE-88093
対応しなかったもの
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
86. #ue4fest
• Instanced Static Mesh
• テストしてみたが、Switchでは1つ1つ描画する方が
パフォーマンスが良かった
• BPのネイティブ化
• 有効にすることで若干高速化することは検証済み
• ネイティブ化が原因のパッケージングエラーが出ることがあり、
安全を優先し無効化
• 既にパフォーマンス要件を満たせていたのも理由
対応しなかったもの
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
89. #ue4fest
• UE4×Switch の パフォーマンス
• 描画の基本設定
• 各種最適化
• アセット、実装、ビルド設定、エンジン改造
以上についてご紹介しました
一見広範囲に見えますが、作業自体はシンプルです
まとめ Switch×UE4 で 60fpsの対戦アクション実現のために
@2020 GungHo Online Entertainment, Inc. All Rights Reserved.
91. #ue4fest
• 所感
• 実機での負荷確認は非常に重要
• 負荷調査のサイクルをどれだけ回せるかが最適化のキモ
• 継続して計測し続けることが大事
• 必要機能をきちんと取捨選択すれば Switch で十分高速に動作する
• デフォルト設定のまま使わない
• 最初に必要な機能や設定と不要なものとを切り分ける事が重要
• 一般的にパフォーマンスで気を付けるべき点は、UE4でも同じ
• エンジンが「いい感じ」にしてくれることは無い
• 機能として用意はされているが、「意識して」使う必要がある
まとめ Switch×UE4 で 60fpsの対戦アクション実現のために