10K Views
April 25, 17
スライド概要
2017/04/15 (土)に開催された「UNREAL FEST WEST '17」で使用した資料です。
http://unrealevent.jp/unreal_fest_west_17/
動画はこちら https://youtu.be/LUD4gBwpqLY
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Robo Recallで使われている 最新のVR開発テクニックをご紹介! Epic Games Japan 岡田 和也 #ue4fest
自己紹介 岡田 和也 (@pafuhana1213) • 昨年11月よりエピック・ゲームズ・ジャパンの サポートエンジニアに GDC2017、Epic Games本社・シアトル支社に 行ってきました! #ue4fest
#ue4fest
アジェンダ • Robo Recallについて • Robo Recallで使われたノウハウのご紹介 • VRコンテンツ開発テクニック • 最適化テクニック #ue4fest
Robo Recallについて Epic Gamesの最新VRゲームタイトル 2016年 OculusConnect3で発表 2017年 3月1日 リリース Oculus Storeにて Touch購入者に対して 無料配信中 #ue4fest
Robo Recall ModKit 全アセット・コード + Mod作成機能を無料配信 #ue4fest
Robo Recall ModKit 作成したModはOculus Store版のRobo Recallに導入可能! #ue4fest
Robo Recall ModKit Mod作成ドキュメントをご用意! • https://docs.unrealengine.com/latest/JPN/Modding/RoboRecall/index.html #ue4fest
国内でRobo RecallのModが! 和牛先生 @3dcganimation #ue4fest
UE4で何か作ったら、是非EpicFridayに! 毎週金曜 は #EpicFriday をつけて進捗ツイート! Epic Games Launcherで ご紹介! #ue4fest
アジェンダ • Robo Recallについて • Robo Recallで使われたノウハウのご紹介 • VRコンテンツ開発テクニック • 最適化テクニック #ue4fest
VRコンテンツ開発テクニック • Epic GamesにおけるVRの取り組み • Showdown, Bullet Trainで使われたテクニック • Robo Recallで使われたテクニック #ue4fest
Epic GamesにおけるVRの取り組み #ue4fest
Showdownについて 市街戦をスローモーションで体験する VRシネマティックコンテンツ 2014年 Oculus Connect で発表 Epic Games Launcherの ラーニングからプロジェクトを ダウンロード可能 #ue4fest
Showdownの製作期間・人員構成 制作期間:6週間 人員構成 • • • • プログラマ:1 ゲームデザイナ:1 アーティスト:1 サウンド:1 (2週間) #ue4fest
フェイク影 影の描画処理は重いため、擬似的な表現に レンダリング負荷を軽減 #ue4fest
VRと相性のいいエフェクトの採用 従来のビルボードを使った手法は VRとは相性が悪い #ue4fest
VRと相性のいいエフェクトの採用 3Dモデルを使った立体的なエフェクト #ue4fest
Bullet Trainについて モーションコントローラ”Oculus Touch”を使った VRアクションゲーム 2015年 OculusConnect2で発表 OculusStoreにて無料配信中! #ue4fest
Bullet Trainの製作期間・人員構成 制作期間:約10週間 人員構成 • 前半の3週間 • プログラマ:1 • ゲームデザイナ:1 • アーティスト:1 • 後半の7週間 • 12~16人 #ue4fest
快適なVRアクションを実現するための工夫 • モノを掴める範囲の調整 • 投げたモノに対しての軌道アシスト #ue4fest
テレポート移動の採用 「体感」と「視覚」の不一致によるVR酔いを回避 #ue4fest
GDC2016 Going Off the Rails: The Making of 'Bullet Train' • 動画とスライド • https://www.youtube.com/watch?v=QIexGSksnPQ • https://www.slideshare.net/HuNing/going-off-the-rails • Someluさんによる翻訳記事 • http://qiita.com/Somelu01/items/7ad9e03adbbd2afee7e4 #ue4fest
VRコンテンツ開発テクニック • Epic GamesにおけるVRの取り組み • Showdown, Bullet Trainで使われたテクニック • Robo Recallで使われたテクニック #ue4fest
Robo Recallの製作期間と人員構成 制作期間:約1年 人員構成 • • • • • プログラマ:5 ゲームデザイナ:2 アーティスト:5 サウンド:2 QA:2 #ue4fest
Robo Recallで使われたテクニック • より進化した、テレポート移動 • 様々なオブジェクトとのインタラクション • VRに特化したゲームデザイン・ワークフロー • 高速化のためのフェイク処理 #ue4fest
Bullet Trainにおけるテレポート • 移動場所が固定 • Oculusセンサの死角問題への対応 ? #ue4fest
Bullet Trainにおけるテレポート テレポート後にレベルの中心を向くように 向きの変更により、自分の向きを見失う可能性あり ! #ue4fest
Robo Recallにおけるテレポート • 移動場所を指定 • テレポート後の向きを指定 #ue4fest
Oculusセンサへの誘導UI #ue4fest
Robo Recallで使われたテクニック • より進化した、テレポート移動 • 様々なオブジェクトとのインタラクション • VRに特化したゲームデザイン・ワークフロー • 高速化のためのフェイク処理 #ue4fest
オブジェクトとのインタラクション VRだと色んなものを触りたく、握りたくなる • もし触れなかったらガッカリする、没入感の欠如 ユーザが期待する動作と その期待を超える動作を実現する #ue4fest
Robo Recallにおけるインタラクション 物をつかむ、投げる 掴めるオブジェクトには 円状のUIを表示 #ue4fest
Robo Recallにおけるインタラクション 銃弾を銃で弾き返す NVIDIA PhysX 3.4への対応 (4.14) CCD(連続したコリジョン検出) #ue4fest
Robo Recallにおけるインタラクション ロボットの頭・腕・足を引きちぎる インタラクション用の システム・コンポーネントを構築 #ue4fest
Robo Recallにおけるインタラクション 物理による簡易インタラクション 作業コストと ゲームにおける重要度を考慮 #ue4fest
Robo Recallで使われたテクニック • より進化した、テレポート移動 • 様々なオブジェクトとのインタラクション • VRに特化したゲームデザイン・ワークフロー • 高速化のためのフェイク処理 #ue4fest
非VRにおけるゲームデザイン 上下のカメラ向き調整が面倒 平面的なゲームデザイン #ue4fest
VRにおけるゲームデザイン ヘッドトラッキングによるカメラ向き調整 上下も考慮した3次元的なゲームデザイン #ue4fest
#ue4fest
#ue4fest
VRにおけるスケール感 VRにおいてスケール感は重要 #ue4fest
VRにおけるスケール感 VRにおいてスケール感は重要 ・・・? 調整に失敗すると 没入感・プレゼンスが低下・消滅 #ue4fest
VRにおけるスケール感 VRにおいてスケール感は重要 調整に失敗すると 没入感・プレゼンスが低下・消滅 #ue4fest !?
モニタとVRHMDの見え方の違い モデルが小さく見えるなぁ… 特定の角度から見ると 変に見えるなぁ… #ue4fest
モデルの最終チェックはVRで 実際のレベルにモデルを配置して、VR上で確認 #ue4fest
#ue4fest
Robo Recall ステージ2との比較 #ue4fest
GoogleMapを使ったレベルデザイン GoogleMapのジオメトリを スケール感のリファレンスに採用 • ゲームで使用しているモデルは全て作成したもの コンセプトアートも サンフランシスコで撮影した写真をベースに #ue4fest
Robo Recall 聖地巡礼リンク • ステージ1 • ステージ2 #ue4fest
Robo Recallで使われたテクニック • より進化した、テレポート移動 • 様々なオブジェクトとのインタラクション • VRに特化したゲームデザイン・ワークフロー • 高速化のためのフェイク処理 #ue4fest
アニメーションするフェイク影 単純な回転の場合、マテリアルで制御した方が処理負荷が低い #ue4fest
#ue4fest
3ds Maxを用いた影用テクスチャの生成 UE4のライティング設定を反映したシーン + 対象となるモデルを使用 #ue4fest
3ds Maxを用いた影用テクスチャの生成 UE4のライティング設定を反映したシーン + 対象となるモデルを使用 #ue4fest
CapsuleShadowを用いた簡易的な影 物理アセットのカプセルを影用のモデルに • 直接影・間接影をサポート #ue4fest
窓を表現するためには • ガラス (半透明・屈折) • 内装のモデル • 反射 • etc… 処理負荷軽減のために、擬似的な表現を #ue4fest
Showdownにおける窓の表現 Parallax Occlusion Mapping (視差遮蔽マッピング) 実際は平面の板ポリ #ue4fest
Robo Recallにおける窓の表現 #ue4fest
Robo Recall Modkitで全て見れちゃいます! M_BuildingWindows_Master M_InteriorMapping_ShopFront #ue4fest
前半のまとめ オブジェクトとのインタラクション ユーザの期待に応えつつ、その期待を超える動作を実現 #ue4fest
前半のまとめ VRにおけるスケール感の問題 最終チェックは必ずVRで 現実世界をリファレンスにする #ue4fest
前半のまとめ VRコンテンツにおいて有用な高速化テクニック 疑似表現による処理負荷の軽減 #ue4fest
アジェンダ • Robo Recallについて • Robo Recallで使われたノウハウのご紹介 • VRコンテンツ開発テクニック • 最適化テクニック #ue4fest
Robo Recallで使われた、最適化テクニック • 想定動作環境 • レギュレーション・チェックフロー • エンジン側における最適化 • レンダリング処理 • Game / System処理 • タイトル側における最適化 #ue4fest
Robo Recallの想定動作環境 GPU:GTX970 CPU:2.7GHz • VR Ready: 3.3GHz (Core i5-4590 ) FPS:90fps (11ms) 約9ms • Compositorを考慮して #ue4fest
Robo Recallで使われた、最適化テクニック • 想定動作環境 • レギュレーション・チェックフロー • エンジン側における最適化 • レンダリング処理 • Game / System処理 • タイトル側における最適化 #ue4fest
レギュレーションについて アセット・仕様などを作成する際の指針 #ue4fest
レギュレーションについて アセット・仕様などを作成する際の指針 • モデルのポリゴン数 #ue4fest
レギュレーションについて アセット・仕様などを作成する際の指針 • モデルのポリゴン数 • 各レベルにおけるドローコール #ue4fest
レギュレーションについて アセット・仕様などを作成する際の指針 • モデルのポリゴン数 • 各レベルにおけるドローコール • 各レベルに配置されるActorの数 など #ue4fest
レギュレーションがないとき (初期~中期) とにかくハイクオリティなモデルを! いっぱい敵を出してゲームを面白く! アーティスト ・ デザイナ #ue4fest
レギュレーションがないとき (初期~中期) フレームレート全然出てない… ロード時間長すぎ… アーティスト ・ デザイナ #ue4fest プログラマ
レギュレーションがないとき (初期~中期) アーティスト ・ デザイナ #ue4fest プログラマ
レギュレーションがないとき (リリース間近) もうこれ以上最適化できない… アセットのクオリティ落として…敵減らして… プログラマ #ue4fest
レギュレーションがないとき (リリース間近) せっかく良いモデル作ったのに… ゲームバランス調整しないと… プログラマ #ue4fest アーティスト ・ デザイナ
レギュレーションがないとき (リリース間近) 何とかリリース… プログラマ #ue4fest アーティスト ・ デザイナ
だれのせきにん? • 必要以上に高クオリティなアセットを作ったアーティスト? • 処理負荷の高い仕様を作ったデザイナ? • 最適化しきれなかったプログラマ? レギュレーションを作っていなかったチーム全体の責任 #ue4fest
レギュレーションがあるとき ポリゴン数に余裕あるから、この敵モデルは少しリッチに! 敵10体まで出せるから、配置はこんな感じにしよう! 指針があるので、無駄なく作業ができる! 保証されているので、安心して作業できる! アーティスト ・ デザイナ #ue4fest
レギュレーションがあるとき 処理が少し重いぞ…? レギュレーションを見ながらチェックしよう このモデルのポリゴン数が多い!5000まで削ってもらおう 調査・最適化作業をする際の指針にもなる! より具体的な修正依頼を出せる! 最適化担当プログラマ #ue4fest
レギュレーションの策定タイミング・策定方法 初期~中期の段階で策定するのがベスト • アートの方向性・クオリティも同じ段階で確立させる ベンチマークとなるレベルを作り、その結果を元に策定 「ワークフローを必ず2週回す」 UE4極め本 第4章より #ue4fest
1週目を最大限に活かす! レギュレーション策定 #ue4fest
Robo Recallにおけるレギュレーション • Environment (合計) • ドローコール:900 • ポリゴン数:180万 • Characters (合計) • ドローコール:300 • ポリゴン数:40万 • Actor • 1600個 • Tick処理が動作するのは、250以下 #ue4fest Bullet Trainをベンチマークに
レギュレーションの活用例 (敵ロボモデルの制作) 画面上に表示される敵ロボットは 最大5体になるよう調整します! デザイナ #ue4fest レギュレーションは40万ポリゴンだから… 他のオブジェクトを考慮して、約4万で! アーティスト
チェックフロー 1週間ごとに、1つのレベルで、QAがパフォーマンステスト バグ発見! ヒッチ発生! QAによるテスト #ue4fest 各担当者が調査・修正
注意 : VRSDKによるフレーム固定(vsync)問題 処理が遅いと、90fpsから45fpsにフレームが固定される 固定が解除されるまで一定時間待つ必要あり 正常な処理時間を計測することができない #ue4fest
Emulate HMD performance VR描画を擬似的に再現することで フレーム固定問題を回避 • Launch with –emulatestereo • Set resolution to 2160x1200 • Set r.screenpercentage 140 #ue4fest
#ue4fest
疑似VR描画のもう一つの利点 プロファイルを取る度にHMDを着脱しなくていい! #ue4fest
HMD非接続時もプレイできるように #ue4fest
最終チェックは必ずVRで! #ue4fest
Robo Recallで使われた、最適化テクニック • 想定動作環境 • レギュレーション・チェックフロー • エンジン側における最適化 • レンダリング処理 • Game / System処理 • タイトル側における最適化 #ue4fest
レンダリング方式の変更 • Deferred Rendering • Gバッファを用いた様々な表現が可能 • Forward Rendering for VR (4.14) • Deferred Renderingよりも処理負荷が低い (約22%改善) • MSAAが使える! • Gバッファが使えない Robo RecallではForwardを採用 #ue4fest
Forward Rendering for VR (4.14) 詳細・経緯などは以下のスライドで 「UE4.14で広がるVRの可能性」 https://www.slideshare.net/EpicGamesJapan/ue414vr #ue4fest
Instanced Stereoscopic Rendering (UE4.11) 両目の映像を同時にレンダリング • ドローコール削減 Bullet Trainの場合 • CPU:約14%改善 • GPU:約 7%改善 #ue4fest
メッシュ結合機能 (UE4.14) 複数のActorを結合したStatic Meshを生成 • ドローコール削減 #ue4fest
カリング処理について 視野外のものは描画しない 処理負荷を軽減! #ue4fest
カリング効率に注意! カリング効率が低下 処理負荷が逆に増える可能性が モデルを結合する際は カリング効率と天秤にかける #ue4fest
Precomputed Visibility Volumes カリング領域の事前計算 • ランタイムコストの削減 「動くオブジェクトは対象にしない」等の 制限があるため、 全てのプロジェクトで有効な手法というわけではない #ue4fest
Robo Recallで使われた、最適化テクニック • 想定動作環境 • レギュレーション・チェックフロー • エンジン側における最適化 • レンダリング処理 • Game / System処理 • タイトル側における最適化 #ue4fest
BPの処理速度問題 VMオーバーヘッドの負荷問題 BP #ue4fest VM CPP
BPのネイティブ化 (UE4.15) 事前にBPをC++ (dll)に変換し 実行ファイルに埋め込み • VMオーバーヘッドを排除 Robo Recallの場合、0.25ms以上 高速化 処理速度の改善度合いは、BPの量・組み方に依存 #ue4fest
ネイティブ化における注意事項 全てのBPをネイティブ化すると 実行ファイルのサイズが肥大化するので注意 • プロジェクト設定の Blueprint Nativization MethodをExclusiveに • 処理負荷の高いBPのみをネイティブ化対象に指定 #ue4fest
ネイティブ化に関するドキュメント • ブループリントのネイティブ化 https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/Technical Guide/NativizingBlueprints/index.html • 高度なブループリントのネイティブ化 https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/Technical Guide/NativizingBlueprints/Advanced/index.html #ue4fest
BlueprintとC++の理想的なバランス • Blueprint : • 高速なイテレーションが求められる部分 (プロトタイプ、パラメータ調整) • ゲームデザイナ、アーティスト • C++ : • BPでは実装が難しい複雑な処理 (システム部分、BaseClass) • プログラマ Robo Recallではこのバランスを実現 BPの数が多かったため、ネイティブ化はとても効果があった! #ue4fest
Robo Recallで使われた、最適化テクニック • 想定動作環境 • レギュレーション・チェックフロー • エンジン側における最適化 • レンダリング処理 • Game / System処理 • タイトル側における最適化 #ue4fest
そのTickイベント、本当に必要? Tickイベント:毎フレーム呼ばれるイベント • 処理が繋がっていなくても、わずかな処理コストが発生 • 不要なら切る • 更新間隔を変更 #ue4fest : Tick EnabledをOFF (デフォルト:ON) : Tick Intervalを調整
オブジェクトのプール • 何かを生成(Spawn)する処理は重い! • GCによるメモリ回収処理の負荷 事前にオブジェクトを生成し そのオブジェクトを使いまわす #ue4fest
Robo Recallにおける実装箇所 OdinObjectPoolManager ( C++ ) #ue4fest
処理タイミングをずらして負荷分散 多数のオブジェクトをSpawnする場合 Spawnタイミングを複数フレームに分割 ① ② 90fpsの場合、①と③の間は わずか0.02秒 → ばれない ③ #ue4fest
インタラクション用コンポーネントシステムの問題 部位ごとに必要な要素 • 位置指定用のSceneComponent • 掴み判定用のCollisionComponent • 掴み可能UI用のSprite #ue4fest
インタラクション用コンポーネントシステムの問題 部位ごとに必要な要素 • 位置指定用のSceneComponent • 掴み判定用のCollisionComponent • 掴み可能UI用のSprite とある敵ロボットの場合 • 頭+胴体+両手+両足+武器+… = 50 Component! #ue4fest
移動処理がボトルネックに… Update Transform() ! Update Transform() ! Update Transform() ! Capsule Component Scene Component Update Transform() ! Scene Component Move Actor #ue4fest Update Transform() ! Update Transform() ! Scene Component Capsule Component
移動処理がボトルネックに… コリジョンチェック! Capsule Component Scene Component Scene Component Move Actor Scene Component #ue4fest Capsule Component
移動処理負荷問題の解決方法 プレイヤーと敵ロボットの位置関係 高負荷 高負荷 Player 高負荷 高負荷 #ue4fest
移動処理負荷問題の解決方法 離れている場合、インタラクション用コンポーネントを外す 低負荷 低負荷 Player 高負荷 低負荷 #ue4fest
移動処理負荷問題の解決方法 改善結果 • GameThreadが約半分に! 実装箇所 • OdinInteractionCacheComponent(C++)の TickComponent #ue4fest
導入予定の機能について #ue4fest
Super-Frustum Culling 両目のカリング処理を同時に実行 • テスト環境で、Render Threadが約1ms改善 #ue4fest
Monoscopic Far-Field Rendering 目から遠くなるほど 視差は小さくなる 目から遠いオブジェクトは 右目と左目の描画結果がほぼ同じ #ue4fest
Monoscopic Far-Field Rendering モバイル版は4.15でリリース済 (実験的機能) #ue4fest
後半のまとめ 開発初期・中期に策定すべきもの レギュレーション (アセット・仕様を作る上での指針) #ue4fest
後半のまとめ エンジン側のCPU・GPU処理最適化 Blueprintのネイティブ化 Forwardの採用, 両眼を同時描画, メッシュ結合, カリング事前計算 全てのプロジェクトで有効、というわけではない #ue4fest
後半のまとめ タイトル側の最適化 不要な処理は走らせないように制御 SpawnやGCによる重たい処理を回避 #ue4fest
本講演に関する質問はこちらからどうぞ! mail : [email protected] Twitter : @pafuhana1213 #ue4fest