14.6K Views
October 07, 19
スライド概要
補足:LRUキャッシュの導入を検討する際は OpenGL.UseEmulatedUBsの有効化も合わせてご検討ください。
講演動画:https://youtu.be/A_l65FlY25I
Part 2:https://www.slideshare.net/EpicGamesJapan/ue4-festeast2019-ue4mobilepart2-179705328
2019年10月6日に行われた「UNREAL FEST EAST 2019」で登壇した際に使用した資料です。
●公式サイト
https://unrealengine.jp/unrealfest/
===
シェーダコンパイルによるカクツキなどモバイルゲーム開発特有の問題は数多くあり、それらはユーザのストレスに繋がる可能性があります。UE4はそういった問題に対しての機能を持っていますが、用法・用量を守って正しく使わないと別の問題を引き起こしてしまいます。そこで本講演ではそれらの機能の使い方、注意点などについて解説します(他のプラットフォーム開発でも役立つ内容にする予定です)。あ、今年は1人講演です。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
そう、UE4ならね。 あなたのモバイルゲームをより快適にする 沢山の冴えたやり方について Part1 Epic Games Japan Support Engineer 岡田和也
本日のハッシュタグ #ue4fest スライドは近日公開予定 しました
本スライド、300ページ超えだったせいなのか Slideshareへのアップに失敗しました /(^o^)\ そのため、Part1, 2に分割しています Part 2のURLに関しましては Slideshareの説明文をご確認ください
自己紹介 Epic Games Japan サポートエンジニア 岡田 和也 Twitter: おかず ( @pafuhana1213 ) ライセンシのサポート業務や講演が主なお仕事 モバイル担当してます 最近
国内のUE4モバイルタイトル 増えてきました…!
国内のUE4製モバイルタイトル
New! VARIOUS DAYLIFE(バリアスデイライフ) Apple Arcade にて 絶賛配信中!
UE4モバイルタイトルに携わる人向けに より実践的な話をせねば…!
これまでのUE4モバイルに関する講演を 振り返ってみると…
モバイル関連の機能・最新情報紹介 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを 全部まるっとご紹介! + UE4.18 モバイル最新情報の紹介 https://www.slideshare.net/EpicGamesJapan/cedeckyushu-2017-ue4tips UE4のモバイル向け機能や最新情報などを改めて紹介!2019 https://www.slideshare.net/EpicGamesJapan/ue4mobilestudy
コンテンツアップデートについて UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 – https://www.slideshare.net/EpicGamesJapan/ue4-chunk-id 徹底解説!UE4を使ったモバイルゲーム開発における コンテンツアップデートの極意! https://www.slideshare.net/EpicGamesJapan/ue4-95204920
某ブログにて 【UE4 & Android】実機デバッグ実行中のログ確認方法について http://pafuhana1213.hatenablog.com/entry/2019/02/20/013340 UE4 & iOS開発時の実機デバッグ・プロファイリング方法 まとめ 2018 http://pafuhana1213.hatenablog.com/entry/2018/12/13/031332
振り返ってみると… モバイル開発において避けることができない モバイル特有のヒッチ メモリ問題 についてガッツリ話したことがない! ユーザのストレス・継続率に 大きく影響する重要な問題
これらの問題に対する対策が 不十分な場合、様々な問題が発生します
たとえば… ● プレイ中のカクツキ ● 長時間ロード ● 発熱からのパフォーマンス低下 ● 猛烈に減る電池 ● 突然のクラッシュ ● などなどなど…
やばい
早い段階から対策を入れることで ゲームをより快適にしていきましょう! (普段の開発も快適に!)
本日のお品書き ヒッチ対策 編 ● ● ● そもそもヒッチってなに? 一般的なヒッチ対策について モバイル特有のヒッチ対策について メモリ管理 編 ● ● なぜモバイル開発において問題になるのか メモリに関するプロファイル方法について 最新情報 編 ● UE4.23 で入った モバイル関連の便利機能・最適化について
そもそもヒッチってなに?
ヒッチ( Hitch )とは? ● 引っかける ● (くいなどに)つなぐ ● (…を)ぐいと動かす ● (ヒッチハイクで)させてもらう ● ヒッチハイクで行く Weblio英和辞書 より
いわゆる、カクつき
ゲームにおけるカクつき それまで滑らかに動いていたのが 急にカクついたり、一定時間画面が止まったり… https://youtu.be/6oR9GWGgBZY
イライラがすごい
海外だとHitchと表現することが多いため 本講演もそれに倣います Google先生に聞くときもこれを意識するのオススメ!
ヒッチは なぜ / いつ 起きる? あるフレーム(タイミング)で 非常に負荷が重い処理 、 または 大量の処理 が実行されたときに発生
ヒッチは なぜ / いつ 起きる? あるフレーム(タイミング)で 非常に負荷が重い処理 、 または 大量の処理 が実行されたときに発生
ヒッチを回避するには どうすればいいのか?
ヒッチ対策の基本的な方針 その1 負荷 を 削減
ヒッチ対策の基本的な方針 その2 処理の数 を 削減
ヒッチ対策の基本的な方針 その3 大量の処理 を 複数フレーム に 分散
ヒッチ対策の基本的な方針 その3.5 大量の処理 を 複数フレーム に 分散
ヒッチ対策の基本的な方針 その4 重い処理 を 複数フレーム に 分散
ここまでのまとめ ヒッチを回避するには どうすればいいのか? 負荷を 削減 ・分散する
本日のお品書き ヒッチ対策 編 ● ● ● そもそもヒッチってなに? 一般的なヒッチ対策について モバイル特有のヒッチ対策について メモリ管理 編 ● ● なぜモバイル開発において問題になるのか メモリに関するプロファイル方法について 最新情報 編 ● UE4.23 で入った モバイル関連の便利機能・最適化について
ヒッチが起きやすいタイミング ● アセット・レベルのロード ● オブジェクトの生成 ● ガベージコレクション(GC)
アセットのロード数を 削減 アセット間の参照関係を整理 ● 直接参照の場合 連鎖的にロード処理が走るため Unreal Fest East 2018 Nintendo Switch『OCTOPATH TRAVELER』は こうして作られた https://www.slideshare.net/EpicGamesJapan/ nintendo-switchoctopath-traveler
アセットのロード数を 削減・分散 レベルを複数のサブレベルに分割 ● ● 必要に応じてロード・アンロード ロードタイミングの分散
アセットのロード数を 分散 実際に使われる前に事前ロード(前読み) Qiita:Asset Managerのアセットの非同期ロード機能について
ヒッチが起きやすいタイミング ● アセット・レベルのロード ● オブジェクトの生成 ● ガベージコレクション(GC)
動的にActorを生成すると… アセットのロード後に各初期化処理が走る ● Construction Script, Begin Playなど BP_Bullet
オブジェクトの生成処理を 削減・分散 ● Construction Script, Begin Play における処理の削減・分散 ● 生成タイミング自体を分散 ● オブジェクトプール(常駐・使い回し)で分散
ヒッチが起きやすいタイミング ● アセット・レベルのロード ● オブジェクトの生成 ● ガベージコレクション(GC)
GCの対策 この資料読んで!以上! [4.20版] UE4におけるLoadingと GCのProfilingと最適化手法 https://www.slideshare.net/ EpicGamesJapan/ 420-ue4loadinggcprofiling-108367408
ここまでのまとめ これらの問題・対策は 全てのプラットフォームにおいて有効! 他にもヒッチの原因・対策はありますが… 負荷の削減・分散という考え方を大事にしましょう! もちろん プロファイリング をした上で!
本日のお品書き ヒッチ対策 編 ● ● ● そもそもヒッチってなに? 一般的なヒッチ対策について モバイル特有のヒッチ対策について メモリ管理 編 ● ● なぜモバイル開発において問題になるのか メモリに関するプロファイル方法について 最新情報 編 ● UE4.23 で入った モバイル関連の便利機能・最適化について
モバイル特有のヒッチ対策…?
なぜモバイル特有の問題が起きるのか? ハードウェア構成 と グラフィックAPI が 他のプラットフォームと異なるから!
モバイル端末のハードウェア構成 SoC (System on a Chip) を採用 ● ● CPU, GPU, メモリなどの各パーツをひとまとめにしたもの モバイル向けに省電力対応が入っている
モバイル端末のグラフィックAPI Windowsなどで採用されている DirectX ではなく モバイル向けのAPI ( OpenGL ES, Vulkan, Metal ) を採用
この違いにより何が起きるか… それは… Shader Compile 問題 メモリ転送速度 問題
Action RPGサンプルで検証 検証端末:Xperia Z5 ● ● Snapdragon 810 2015年10月発売
https://youtu.be/ArHDo9v4rJg
CPUプロファイラ計測結果 150 ms 100 ms 50 ms
CPUプロファイラ計測結果 150 ms 100 ms 50 ms Shader Compile 問題 メモリ転送速度 問題 が原因
強烈なヒッチが発生するため このモバイル特有の問題への 対応は必須です
そして、 本日ご紹介する対応を入れると…
https://youtu.be/n_bIFnrlxu0
ヒッチが完全に無くなります! これはもうやるしかないですよね…!?
やってやりましょう
モバイル特有のヒッチ対策について ● Shader Compile 問題 ● メモリ転送速度 問題
Shader Compile問題について ● なぜShader Compile問題が発生するのか? ● PSO キャッシュについて ● ● ● Tips ● ● ● 概要・流れ 使うために必要な操作・設定 PSOキャッシュによるPreCompile時間について ProgramBinaryCache ProgramLRUCache
本講演では「Shaderを使えるようにする処理」のことを Shader Compile とします 通常は Shader Compile は作業中だけですが… モバイルの場合 実機でも Shader Compile が行われます!
ActionRPG における 敵キャラ の 初出現時 の負荷を計測 検証端末:Xperia Z5 ( Snapdragon 810, 2015年10月発売 )
Action RPG における 敵キャラ初出現時の負荷 検証端末:Xperia Z5 ( 2015年10月発売 )
Action RPG における 敵キャラ出現時の負荷 Shader link Time : 471.014 ms Shader Compile処理の一部 約15フレーム(30fpsの場合) 検証端末:Xperia Z5 ( 2015年10月発売 )
なぜモバイルの場合 Shader Compileの問題が発生するのか?
実機上でShader Compileが問題になる理由 グラフィックスAPIの仕様 & モバイル端末のCPU性能
Android, iOSで採用されているグラフィックスAPI Android ● ● OpenGL ES Vulkan iOS ● ● OpenGL ES Metal
OpenGL ES 開発会社・端末(ドライバ)毎に 実装・対応している機能が異なる状況 オフライン(事前)Shader Compileができず 実機上で行う必要がある
OpenGL ES Shaderのソースコードを載せて、 実機上でShaderのCompile処理を実行 ソースコード Shader Program 中間データ Compile OpenGLShader() LinkProgram()
OpenGL ES Shader Compile処理が完了すると 描画に必要な Shader Program がメモリ上に確保される ● 2回目以降は↑を使い回す = 起動後に初めて使われる時のみShader Compileが走る ソースコード Shader Program 中間データ Compile OpenGLShader() LinkProgram()
Android, iOSで採用されているグラフィックスAPI Android ● ● OpenGL ES Vulkan iOS ● ● OpenGL ES Metal
時間などの関係で Vulkanの話は しません!!!
時間などの関係で Vulkanの話は しません!!! 少しします
Vulkanについて ローレベルなグラフィックスAPI OpenGL ESに比べてパフォーマンスが良い Vulkanが抱えている課題 古い端末の場合、 ドライバが原因でパフォーマンスが出ない
UE4とVulkanについて UE4.21リリースノートより ● OpenGL ES 3.1 との 機能互換性 が 100% ● OpenGL ES よりも 最大 20% 高速で実行できる可能性 GPU負荷に関しては少し上がる可能性あり (鋭意対応中)
Vulkanの採用を検討する基準についての参考情報 Vulkanによるパフォーマンス向上を見込める端末 ● Snapdragon 845 以上 ● Mali-G76 以上 FortniteにてVulkanを有効にしている端末 ( 2019年3月時点 ) ● Galaxy S9 ( Adreno ) ● Galaxy Note 9 ( Adreno, Mali ) ● Galaxy S10 ( Adreno, Mali )
UE4のVulkan対応に関する詳細資料 ● Vulkan! Powering AAA Experiences on Android https://www.unrealengine.com/ja/events/unreal-fest-europe-2019/vulkan-powering-aaaexperiences-on-android?lang=ja
Android, iOSで採用されているグラフィックスAPI Android ● ● OpenGL ES Vulkan iOS ● ● OpenGL ES Metal 非推奨になったため UE4.24で サポート対象外に
Metal ローレベルなグラフィックスAPI OpenGL ESに比べてパフォーマンスが良い
Metal オフラインShader Compileが可能 実機上でShader Compileしなくていい Working with Metal: Overview https://developer.apple.com/videos/play/ wwdc2014/603/
オフラインShader Compileをするには ● Mac上でビルドする ● Enable Remote Shader Compileを 有効にした状態でリモートビルド (UE4.21, 4.22で不具合あり。4.23で修正)
Metalに関する負荷 Shaderの初回使用時に Pipeline State Object の生成処理が必要 ● ● GPUに渡す描画設定リスト OpenGL ESと同様に 2回目以降は生成されたものを使い回す この生成処理がモバイルのCPU性能では 非常に重く…ヒッチの原因に… https://software.intel.com/en-us/blogs/2014/07/23/direct3d12-overview-part-2-pipeline-state-object
Action RPG における 敵キャラ初出現時の負荷 検証端末:iPhone 7 ( 2016年9月発売 )
Action RPG における 敵キャラ初出現時の負荷 PipelineState time : 189.698 ms 検証端末:iPhone 7 ( 2016年9月発売 )
ざっくりまとめ 起動後 に 初めて 使われる Shaderの場合 Shader Compile 処理で生成されるデータが必要 ● Shader Compile処理は非常に重い 生成されたデータは使い回せるため、 1度使用されたShaderを再度使うときは Shader Compile処理が走らない OpenGL ESの場合は 生成されたデータはアプリ終了時に消去されるため 2回目以降の起動でも、初回使用時はShader Compileが必要になる
Shader Compileの負荷問題に どう対策するか?
グラフィックスAPIの標準機能を活用する方法 Shader Compile結果をストレージに保存することで 2回目以降の起動でも再利用可能に ● ● Android : iOS : GL_OES_get_program_binary 拡張 Metalの標準機能 問題 ● ● 初回起動 かつ 初回使用時のヒッチが解決できない Androidの場合、メモリ使用量が膨大になる
この問題を解決するために生まれた機能が… Pipeline State Object (PSO) キャッシュ ( FShaderPipelineCache )
Shader Compile問題について ● なぜShader Compile問題が発生するのか? ● PSO キャッシュについて ● ● ● Tips ● ● ● 概要・流れ 使うために必要な操作・設定 PSOキャッシュによるPreCompile時間について ProgramBinaryCache ProgramLRUCache
PSOキャッシュはどういう機能? 事前に作成したShaderのリストを元に Shader の PreCompile ( WarmUp ) を行う機能
PSOキャッシュが ない とき ヒッチ 発生! Shader Compile ! メモリ キャッシュ
PSOキャッシュが ある とき PreCompile ! キャッシュ
PSOキャッシュ使用前 ● CreateBoundShaderState time ● Shader link Time : 472 ms : 471 ms PSOキャッシュ使用後 ● CreateBoundShaderState time ● Shader link Time : 0.6 ms :0 ms 470ms あった負荷が 1ms以下に!
PSOキャッシュの流れ ~ 事前準備からPreCompileまで ~
まずはイメージを掴むため 簡略した流れを紹介
PreCompileを行うための事前準備 を圧縮した 実機上でゲームをプレイし Shaderの組み合わせリスト を作成 を含めた ユーザへの配布パッケージを作成
ユーザがプレイする際の実機上での処理 のリストにあるShaderに対して Shader Compile。結果はメモリに保存 メモリに保存された結果を再利用 (Shader Compileをスキップ)
開発 環境 本番 環境
各処理の詳細について説明しますが 今は細かい部分は無視してダイジョブです ふいんき(←なぜか変換できない) を感じてください
1. Shaderの組み合わせリストの収集 後述の設定を行った後にCookして Stable Shader情報リスト( *.scl.csv )を生成 ● /Saved/Cooked/<PLATFORM>/<PROJECT>/Metadata/PipelineCaches
scl.csvの中身
scl.csvの中身 Key Value ClassNameAndObjectPath Material /Engine/EngineMaterials/DefaultTextMaterialOpaque.DefaultTextMaterialOpaq ue ShaderType TMobileBasePassPSFMobileMovableDirectionalLightAndSHIndirectPolicyIN T32_MAXHDRLinear64Skylight ShaderClass MeshMaterial MaterialDomain MD_Surface FeatureLevel ES3_1 QualityLevel High TargetFrequency SF_Pixel TargetPlatform GLSL_ES3_1_ANDROID VFType FLocalVertexFactory Permutation Perm_0 OutputHash 8970309F7B3BF9D92B463D067104580E5AAA3519