1.7K Views
October 07, 25
スライド概要
UE5 Mobile Game Development Essentials 2025 の講演における公開資料です。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UE5.6におけるモバイルグラフィックス モバイル向け設定の基礎と最適化 Software Engineer, Developer Relations Yutaro Sawada Senior Software Engineer, Developer Relations Takashi Suzuki
UE5.6におけるモバイルグラフィックス モバイルグラフィックスの難所とUEにおける対応方法、最新機能 澤田 デバイスプロファイルと各種設定 デバイスプロファイルの仕組みや各種設定について 鈴木
~ UE 5.6 UE5.6における モバイルグラフィックス モバイルグラフィックスの難所 UEにおける対応方法 最新機能紹介 モバイル開発向け便利機能や最新機能の紹介
~ UE 5.6 UE5.6における モバイルグラフィックス モバイルグラフィックスの難所 UEにおける対応方法 最新機能紹介 モバイル開発向け便利機能や最新機能の紹介
モバイルグラフィックスの難所 メモリ帯域が限定される ・省メモリ設計が必要 ↑ メモリアクセスも バッテリーを使う 端末の種類が多い(下限が低い) ・OS ・SoC(CPUやGPU) ・画面の解像度 ・端末の冷却性能
モバイルグラフィックスの難所 メモリ帯域が限定される ・省メモリ設計が必要 ↑ メモリアクセスも バッテリーを使う コンテンツ調整 モバイル向け レンダラーを使う 端末の種類が多い(下限が低い) ・OS ・SoC(CPUやGPU) ・画面の解像度 ・端末の冷却性能
UE 5.6 モバイル向けレンダラー ● モバイルフォワード ● モバイルディファード ● デスクトップレンダラー
UE5におけるモバイルで利用可能なレンダラー モバイルフォワード モバイルディファード デスクトップレンダラー フォワード形式のレンダラー ディファード形式のレンダラー 実験的 (Android) / ベータ機能 (iOS) 軽量化のため一部の機能が制限 →機能改善によって制限は減少中 モバイル向け(タイルベースのGPU) に軽量化されているディファードレ ンダラーで、フォワードでは利用で きない描画機能を利用できる PC版で表現されているような描画を 実現するためのレンダラー ハイスペックな端末を必要とする ※モバイルLumen. . . GLES3.2(Android) Vulkan(Android) Metal(iOS)
UE5におけるモバイルで利用可能なレンダラー モバイルフォワード モバイルディファード デスクトップレンダラー フォワード形式のレンダラー ディファード形式のレンダラー 実験的 (Android) / ベータ機能 (iOS) 軽量化のため一部の機能が制限 モバイル向け(タイルベースのGPU) に軽量化されているディファードレ ンダラーで、フォワードでは利用で きない描画機能を利用できる PC版で表現されているような描画を 実現するためのレンダラー ハイスペックな端末を必要とする ※モバイルLumen. . . GLES3.2(Android) Vulkan(Android) Metal(iOS)
UE5におけるモバイルで利用可能なレンダラー モバイルフォワード モバイルディファード モバイルに特化した フォワード形式のレンダラー ディファード形式のレンダラー 設計のレンダラー モバイル向け(タイルベースのGPU) 軽量化のため一部の機能が制限 に軽量化されているディファードレ ンダラーで、フォワードでは利用で きない描画機能を利用できる デスクトップレンダラー 実験的 (Android) / ベータ機能 (iOS) PC版で表現されているような描画を 実現するためのレンダラー ハイスペックな端末を必要とする ※モバイルLumen. . . GLES3.2(Android) Vulkan(Android) Metal(iOS)
切替方法
フォワードとディファードの違い ベースパスとシェーディングパスの分離
モバイルフォワード
モバイルディファード
それぞれの特徴 モバイルフォワード ・ベースが軽量 ・機能拡充が行われており制限は減ってきている ・ローカルライトも使用可能に(負荷の考慮は必要) ・ベイクしたライティングはフォワードの方が有利 デフォルト設定でセルごとのカリングが行われる r.Forward.MaxCulledLightsPerCell = 8 →シンプルなライティングな場合フォワードの方が軽量 モバイルディファード ・タイルベースGPUに最適化されたディファード ・ライトが多数使える ・GBuffer活用 どちらも最適化されている 必要とする機能や、パフォーマンスに応じて選択
レンダラーの選択 ・使いたい機能、コンテンツ次第 ・UEでは各機能がスケーラブルに負荷調整できるように パラメータが用意されている機能が多い → どちらを選択しても調整次第 各種サポート機能がまとめられている https://dev.epicgames.com/documentation/ja-jp/unreal-engine /using-the-mobile-deferred-shading-mode-in-unreal-engine?a pplication_version=5.6
モバイルグラフィックスの難所 メモリ帯域が限定される ・省メモリ設計が必要 ↑ メモリアクセスも バッテリーを使う コンテンツ調整 モバイル向け レンダラーを使う 端末の種類が多い(下限が低い) ・OS ・SoC(CPUやGPU) ・画面の解像度 ・端末の冷却性能
モバイルグラフィックスの難所 メモリ帯域が限定される ・省メモリ設計が必要 ↑ メモリアクセスも バッテリーを使う 端末の種類が多い(下限が低い) ・OS ・SoC(CPUやGPU) ・画面の解像度 ・端末の冷却性能 機種やSoCで設定を切り替えるDeviceProfileの活用
モバイルのSoC(System-on-a-Chip)について 様々な機能が1つのチップに載っているチップ iPhoneは世代ごと、Androidに関しては多くメーカーの端末とSoCが存在 現代は多くの事がスマートフォンを通じて行われているため多種多様のニーズが有り、 様々なスペックの機種が発売されている → 最新=高性能ではない
Android 様々なメーカーによる端末,様々なSoCCPU, GPU iPhone iPhone向けA19, A19 Pro, A18 Pro, A18, A17, A16 ~ iPadやMacbook : M4, M3, M2, M1 ~ 日本で入手可能なSoC Qualcomm: Snapdragon 8 Elite, Gen 3, ~) Mediatek: Dimensity 9400, ~) Google: Tensor G5, G4, G3, ~) Samsung: Exynos 2400e, ~) UNISOC Tiger T820, ~) …
CPUとGPUのアーキテクチャ(最近のハイエンド例) Qualcomm - Snapdragon 8 Elite Mediatek - Dimensity 9400 ・CPU Oryon (Qualcomm) ・GPU Adreno (Qualcomm) ・CPU Cortex (Arm) ・GPU Immortalis (Arm) 載っているコアは別の会社という場合もあり特徴や挙動が異なる場合があるため、それぞれ確認が必要に。 詳細を調査したい場合、それぞれに載っているIPベンダーのプロファイラが必要 Snapdragon Profilerや、ARM Performance Studio等
Android 様々なメーカーによる端末,様々なSoCCPU, GPU iPhone iPhone向けA19, A19 Pro, A18 Pro, A18, A17, A16 ~ iPadやMacbook : M4, M3, M2, M1 ~ 日本で入手可能なSoC Qualcomm: Snapdragon 8 Elite, Gen 3, ~) Mediatek: Dimensity 9400, ~) Google: Tensor G5, G4, G3, ~) Samsung: Exynos 2400e, ~) UNISOC Tiger T820, ~) … Qualcomm以外は、MaliやImmortalisといっ た Arm設計のGPUを使っているものが多い...
Android 様々なメーカーによる端末,様々なSoCCPU, GPU iPhone iPhone向けA19, A19 Pro, A18 Pro, A18, A17, A16 ~ iPadやMacbook : M4, M3, M2, M1 ~ 日本で入手可能なSoC Qualcomm: Snapdragon 8 Elite, Gen 3, ~) Mediatek: Dimensity 9400, ~) Google: Tensor G5, G4, G3, ~) Samsung: Exynos 2400e, ~) 最近発売されたGoogle Pixelの最新機種は PowerVRアーキテクチャを採用 UNISOC Tiger T820, ~) こちらは現在粛々と対応中 … Qualcomm以外は、MaliやImmortalisといっ た Arm設計のGPUを使っているものが多い...
UEでの基本的な設定方針 ・High、Mid、Lowといったプリセット設定を用意 ・DeviceProfile(INIファイル)で各機種GPU向けにプリセットを含む設定が可能 ※細かい型番は正規表現で対応 .\Engine\Config\BaseDeviceProfiles.ini このDeviceProfileに関しては、後半鈴木の講演にて
モバイルグラフィックスの難所 メモリ帯域が限定される ・省メモリ設計が必要 ↑ メモリアクセスも バッテリーを使う コンテンツ調整 モバイル向け レンダラーを使う 端末の種類が多い(下限が低い) ・OS ・SoC(CPUやGPU) ・画面の解像度 ・端末の冷却性能 機種やSoCで設定を切り替えるDeviceProfileの活用
~ UE 5.6 UE5.6における モバイルグラフィックス モバイルグラフィックスの難所 UEにおける対応方法 最新機能紹介 モバイル開発向け便利機能や最新機能の紹介
UE 5.05.6 最新機能紹介 ● デバイス出力ログ - iOSとAndroid対応 ● Stat GPU, Stat Unit, ProfileGPU ● Unreal Insightsで見るGPU ● Mobile GPU Scene ● アンチエイリアシング ● Mobile FSR ● Occlusion Feedback ● Mobile Screen Space Reflections ● Mobile Ambient Occlusion ● モバイルフォワードで Light Function ● Local Lights Buffer
デバイス出力ログ - iOSとAndroid対応 UE5.0からデバイス出力ログでiOSとAndroidに対応 UE上のエディタから実行中のログ表示やコンソールコマンドの実行が可能
Stat GPU, Stat unit(GPU) ConsoleVariables.iniへの設定や、起動時に以下コンソールコマンドを入れることで 対応GPU上でStat unitのGPUやStat GPUが確認可能に(UE5.6) r.Android.SupportsTimestampQueries=1 ※参考値として利用する、iOSでは設定無しで可能 Soul City sample - Oppo Find X8(Immortalis-G925) 起動引数 : dpcvars=r.Android.SupportsTimestampQueries=1
ProfileGPU ProfileGPUも確認可能に 起動引数 : dpcvars=r.Android.SupportsTimestampQueries=1
Unreal Insightsで見るGPU 対応GPU(Android)のみ、細かいパスは見れないので大凡の目安とする 起動引数 :dpcvars=r.Android.SupportsTimestampQueries=1 -tracehost=127.0.0.1 -trace=Bookmark,Frame,CPU,GPU,LoadTime,File -statnamedevents Unreal Insightsについて https://dev.epicgames.com/community/learning/tutorials/eB9R/unreal-engine-gathering-unreal-insights-traces-on-android?locale=ja-jp
モバイル固有の設定について
Mobile GPU Sceneの有効化 UE5.5からGPU Sceneのモバイル版が正式に有効化 GPU Sceneはプリミティブの情報をシーン全体で管理を行い、 同じマテリアルを自動でインスタンス描画を行うオートインスタンシングに対応 ※モバイルではバッファの都合上一部分割が行われ、 スライドの図では32インスタンスずつ描画
アンチエイリアシングについて モバイルでは、r.Mobile.AntiAliasing で設定可能に 0: OFF 1: FXAA 2: TemporalAA(TAA) - r.Mobile.SupportsGen4TAAの有効化が必要 3: MSAA - フォワードのみ 0 : No AA 2 : TemporalAA
4つの手法を比較 0 : No AA 1 : FXAA 2 : TemporalAA ランタイムで切り替えが行えるので、クオリティ等ユーザー側で変えることも可能 3 : MSAA
4つの手法を比較 0 : No AA 1 : FXAA 2 : TemporalAA ランタイムで切り替えが行えるので、クオリティ等ユーザー側で変えることも可能 3 : MSAA
TemporalAA for mobile UE5.3~からモバイル向けTAAの最適化が行われており、 デフォルトでデスクトップ版よりも軽量な設定で動作するように r.TemporalAA.Mobile.UseCompute 0 (Pixel Shader版) r.TemporalAA.UseMobileConfig 0 (サンプル数やShared memoryを使わない最適化設定) ConfigコンソールコマンドはPC用設定、モバイルでは実装内で強制的に有効化 0 : No AA 2 : TemporalAA
Mobile FSR の対応(FidelityFX Super Resolution) エンジンプラグインから有効化し、 コンソールコマンドから設定可能 r.Mobile.FSR.enabled 1 Screen Percentage 70% 1098x504→1568x720
Mobile FSR の設定 デフォルトで、RCAS(Robust Contrast Adaptive Sharpening Filter)が有効なため2パス r.Mobile.FSR.RCAS.enabled 1 r.Mobile.FSR.enabled 1 RCASオンオフの比較 RCAS無しFSRとFSR無しの比較
Occlusion Feedback モバイル向けの新しいオクルージョンカリング手法 r.OcclusionFeedback.Enable 0 従来のオクルージョンクエリと比較してドローコール数の削減が期待 UE5でソフトウェアオクルージョンカリングが廃止となっており、 パフォーマンス上問題がある場合はこちらの機能をお試しください
Mobile Screen Space Reflections プロジェクト設定からサポートを有効化し再起動 r.Mobile.AntiAliasing 2 (TAAの有効化状態を想定) r.Mobile.ScreenSpaceReflections.Intensity -1(反射の強さを調整)
Mobile Ambient Occlusion プロジェクト設定からサポートを有効化し再起動 → ポストプロセスボリュームから調整 r.Mobile.AmbientOcclusionTechnique 0 (0:GTAO, 1:SSAO) r.Mobile.SSAOHalfResolution 0(1で有効化[Bilinear]、2~3でアップスケール設定)
モバイルフォワードでLight Function プロジェクト設定でモバイルローカルライト設定をLocal Lights Buffer Enabledに設定 ※モバイルディファードは元々使用可
Local Lights Bufferモード モバイルフォワード上でライトの計算を分離するモード Full Depth Prepassが必要となる ※Movable Point ShadowやAmbient Occlusionを有効にしている場合 Full Depth Prepassが用意される。利用していない場合は以下設定が必要 [/Script/Engine.RendererSettings] r.Mobile.EarlyZPass=1
Local Lights Bufferモード Full Depth情報を元に、Base Pass前にピクセルごとのライティング情報を焼き付ける フォワード描画時に個別のライトの参照をなくす ・ColorA:マージした色 ・ColorB:平均入射方向とスペキュラスケール MergedLightL = (MergedLightL / MergedTotalWeight); OutColorA = float3(MergedLightColor.x, MergedLightColor.y, MergedLightColor.z); OutColorB.rgb = Pack1212To888(UnitVectorToOctahedron(MergedLightL) * 0.5 + 0.5); OutColorB.a = MergedSpecularScale / MergedTotalWeight; 懸念点: 入射方向が平均化されるため、ライト方向に依存する シェーディングが正しくなくなる(スペキュラ)
まとめ - 実機によるデバッグと最適化は必要 StatやProfileGPU等、計測可能な端末で実機上で(簡易的に)確認 →より詳細をみるには専用のツールが必要 モバイルはTBR等GPUやドライバ側のランタイムで調整、最適化されている部分があり、 個別のドローに関する計測が難しく、A/Bテストが有用 コマンド例: abtest r.Mobile.AmbientOcclusionTechnique 0 1
デバイススペックの幅 市場に出回るデバイスのスペックの幅は非常に 幅広い モバイルが利用できる電力の数十~数百倍を利 用できるコンソール機や PCを含めるとその演算 能力の比は途方もない数字に
Table of contents デバイスプロファイル 各種設定
Table of contents デバイスプロファイル 各種設定
デバイスプロファイル 特定のデバイス上での設定を記述したテキストファイル (*.ini) パフォーマンスを調整するのに利用する 複数のファイルを階層構造で解析して動作 ● ● ● ● EngineDir]/Config/BaseDeviceProfiles.ini ProjectDir]/Config/DefaultDeviceProfiles.ini エンジンのプラットフォーム毎のini ○ EngineDir]/Config/Android/AndroidDeviceProfiles.ini ○ EngineDir]/Config/iOS/iOSDeviceProfiles.ini ○ EngineDir]/Platforms/Console]/Console]DeviceProfiles.ini プロジェクト側のプラットフォーム毎のini ○ ProjectDir]/Config/Android/AndroidDeviceProfiles.ini ○ ProjectDir]/Config/iOS/iOSDeviceProfiles.ini ○ ProjectDir]/Platforms/Console]/Console]DeviceProfiles.ini
DeviceProfiles BaseDeviceProfiles.ini
DeviceProfileManager
デバイスプロファイルの 階層構造 Windows DeviceProfile Console DeviceProfile GlobalDefault DeviceProfile iOS Low iOS DeviceProfile iOS Mid iOS High Android Low Andoid DeviceProfile Android Mid Android High
DeviceProfileの 階層構造 Windows DeviceProfile Desktop DeviceProfile Console DeviceProfile GlobalDefault DeviceProfile iOS Low iOS DeviceProfile iOS High Mobile DeviceProfile 共通基底プロファイルを追加可能 iOS Mid Android Low Andoid DeviceProfile Android Mid Android High
デバイスプロファイルの 記述例 DefaultDeviceProfiles.ini
デバイスプロファイルの 記述例 DefaultDeviceProfiles.ini
デバイスプロファイルの追加 デバイスプロファイルの 記述例 モバイル共通設定 共通の基底プロファイルを指定 DefaultDeviceProfiles.ini
プラットフォームプロファイル プラットフォーム デバイスプロファイル サブプロファイル Windows DeviceProfile Desktop DeviceProfile Console DeviceProfile GlobalDefault DeviceProfile iOS Low iOS DeviceProfile iOS Mid iOS High Mobile DeviceProfile Andorid Low Android DeviceProfile Android Mid Android High
対応プラットフォームの 確認 プロジェクト設定 > 対応プラットフォーム
プラットフォームプロファイル プラットフォーム デバイスプロファイル Windows DeviceProfile Desktop DeviceProfile Console DeviceProfile クック&パッケージ化 クック&パッケージ化 GlobalDefault DeviceProfile iOS DeviceProfile クック&パッケージ化 Mobile DeviceProfile Andoid DeviceProfile クック&パッケージ化
AndroidDevice ProfileSelector 大量のモバイルデバイスのそれぞれに適した サブプロファイルを適用するためのプラグイン AndoridDeviceProfileMatchingRules] セクションに記述したマッチングルール配列から デバイスプロファイルを選択する エンジンに同梱の BaseDeviceProfiles.iniにはGPUの型番で分岐す るルールが記述されている ● ● ● ● スマートフォン名 GPUファミリ OSバージョン などなど [/Script/AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules] ; Match Quest devices directly +MatchProfile=(Profile="Meta_Quest_3",Match=((SourceType=SRC_DeviceMake,CompareType=CMP_Equal,MatchString="Oculus"), (SourceType=SRC_HMDSystemName,CompareType=CMP_Equal,MatchString="Meta Quest 3"))) +MatchProfile=(Profile="Meta_Quest_Pro",Match=((SourceType=SRC_DeviceMake,CompareType=CMP_Equal,MatchString="Oculus"), (SourceType=SRC_HMDSystemName,CompareType=CMP_Equal,MatchString="Meta Quest Pro"))) +MatchProfile=(Profile="Oculus_Quest2",Match=((SourceType=SRC_DeviceMake,CompareType=CMP_Equal,MatchString="Oculus"), (SourceType=SRC_HMDSystemName,CompareType=CMP_Equal,MatchString="Oculus Quest2"))) ~~~~ ; Adreno-based devices +MatchProfile=(Profile="Android_Adreno4xx",Match=((SourceType=SRC_GpuFamily,CompareType=CMP_Regex,MatchString="Adreno \\(TM\\) 4[0-9][0-9]"))) +MatchProfile=(Profile="Android_Adreno5xx_Low",Match=((SourceType=SRC_GpuFamily,CompareType=CMP_Regex,MatchString="Adreno \\(TM\\) 5[0-1][0-9]"))) +MatchProfile=(Profile="Android_Adreno5xx",Match=((SourceType=SRC_GpuFamily,CompareType=CMP_Regex,MatchString="Adreno \\(TM\\) 5[0-9][0-9]"))) ~~~~
マッチングルール の記述例 特定のOSバージョンで切り分けている例 ; 例) “Nexus65536”スマートフォンでOSバージョンが9以上ならVulkanを有効にする、9未満ならGLを選択 +MatchProfile=(Profile="Android_Nexus65536_Vulkan", Match=((SourceType=SRC_DeviceModel, CompareType=CMP_Regex, MatchString="Nexus65536"), (SourceType=SRC_AndroidVersion, CompareType=CMP_Regex, MatchString="([0-9]+).*"), (SourceType=SRC_PreviousRegexMatch, CompareType=CMP_GreaterEqual, MatchString="9"), (SourceType=SRC_VulkanAvailable, CompareType=CMP_Equal, MatchString="true"))) +MatchProfile=(Profile="Android_Nexus65536_GL", Match=((SourceType=SRC_DeviceModel, CompareType=CMP_Regex, MatchString="Nexus65536"))) [Android_Nexus65536_Vulkan DeviceProfile] +CVars=r.Android.DisableVulkanSupport=0 [Android_Nexus65536_GL DeviceProfile] +CVars=r.Android.DisableVulkanSupport=1
Android のデバイス プロファイルとスケーラビリティをカスタマイズする https://dev.epicgames.com/documentation/ja-jp/unreal-engine/customizing-deviceprofiles-and-scalability-in-unreal-engine-projects-for-android
Android コンフィギュレーション ルールシステム DeviceProfilesではなく、 エンジン起動前の Java処理時に実行される設定ファイル デバイスを判断して起動をブロックしたり アプリ起動前にデバイスプロファイルを指定する Android コンフィギュレーション ルール システム https://dev.epicgames.com/documentation/ja-jp/unreal-engine/usin g-the-android-configuration-rules-system-in-unreal-engine?applicat ion_version=5.7
IOSDeviceSettings iOSはモデルナンバーを わかりやすい名前のデバイスプロファイルに対応付けする [IOSDeviceMappings] iPhone8,1=iPhone6S iPhone8,2=iPhone6SPlus iPhone8,4=iPhoneSE iPhone9,[13]=iPhone7 iPhone9,[24]=iPhone7Plus … iPhone17,1=iPhone16Pro iPhone17,2=iPhone16ProMax iPhone17,3=iPhone16 iPhone17,4=iPhone16Plus ; フォールバック設定 未知のiPhoneであれば iPhone15相当に iPhone=iPhone15
特定のハードウェアやドライバーに対して DeviceProfileとは別に設定を追加する仕組み UE5.4 MatchingRulesと DeviceProfileFragments How to Override CVARs for Specific GPUs using Device Profile Matching Rules https://dev.epicgames.com/community/learning/knowledge-base/q3W3/unreal-engin e-how-to-override-cvars-for-specific-gpus-using-device-profile-matching-rules
FragmentIncludes 複数のデバイスプロファイルに 共通設定をインクルードすることが出来る [Android_Use_GL_LRU DeviceProfileFragment] +CVars=r.OpenGL.EnableProgramLRUCache=1 +CVars=r.OpenGL.ProgramLRUEvictTimeSeconds=20 [Android_SlateWorkaround DeviceProfileFragment] +CVars=Slate.EnableRetainedRendering=0 [Android_Low DeviceProfile] +FragmentIncludes=Android_Use_GL_LRU +FragmentIncludes=Android_SlateWorkaround [Android_Mid DeviceProfile] +FragmentIncludes=Android_Use_GL_LRU
スケーラビリティ 各種クオリティ設定 エディタのViewport Scalabilityで設定できるものと同じ仕組み 設定は sg.~で始まるコンソール変数に対応している ● ● ● ● EngineDir]/Config/BaseScalability.ini ProjectDir]/Config/DefaultScalability.ini エンジンのプラットフォーム毎のini ○ EngineDir]/Config/Android/AndroidScalability.ini ○ EngineDir]/Config/iOS/iOSScalability.ini ○ EngineDir]/Platforms/Console]/Console]Scalability.ini プロジェクト側のプラットフォーム毎のini ○ ProjectDir]/Config/Android/AndroidScalability.ini ○ ProjectDir]/Config/iOS/iOSScalability.ini ○ ProjectDir]/Platforms/Console]/Console]Scalability.ini
Scalability PCやモバイルなどでのユーザーによるパフォーマンス調整 コンソールでは特定のスケーラビリティを決め打ちすることが多い Desktop向け Low ~ Epic設定 クオリティ固定 Mobile向け Low ~ Epic設定
スケーラビリティと デバイスプロファイル スケーラビリティはデバイスプロファイルと同じように コンソール変数の書き換えで行われる スケーラビリティ設定はデバイスプロファイルの後に適用されランタイ ムでさらに書き換えることができる ただしデバイスプロファイルとスケーラビリティの両方に 同じコンソール変数に対する設定があった場合 デバイスプロファイルが優先される ことに注意 基本ini設定 デバイスプロファイル スケーラビリティ ユーザー設定
Table of contents デバイスプロファイル 各種設定
CVars (コンソール変数 ) デバイスプロファイルでは主に CVarsまたはコンソール変数と呼ばれ る変数を介してアプリケーションの動作に変更を加えます コンソール変数はアプリケーション実行中に書き換えることができるも のや、エンジン初期化時に参照されるものなど 8000個以上 がエンジンに定義されています
4本指タップで モバイル実機上のコンソールウィンドウ 開発PCに接続されているデバイスに DeviceOutputLogから コンソールコマンドをリモート送信
コンソール変数の
C++コード
コンソール変数はエンジンまたはユーザープロジェクト内の
Cソースファイル中で定義されています
static TAutoConsoleVariable<int32> CVarPostProcessQuality(
TEXT("sg.PostProcessQuality"),
Scalability::DefaultQualityLevel,
TEXT("Scalability quality state (internally used by scalability system,”)
TEXT(“ini load/save or using SCALABILITY console command)\n")
TEXT(" 0:low, 1:med, 2:high, 3:epic, 4:cinematic, default: 3"),
ECVF_ScalabilityGroup | ECVF_Preview);
//変数を読みだして利用する
Ret.PostProcessQuality = CVarPostProcessQuality.GetValueOnGameThread();
コンソール変数の 接頭詞 接頭詞 説明 sg. スケーラビリティグループ r. レンダリング showflag. デバッグ用表示フラグ t. テクスチャ、 Tick/Time a. アニメーション p. 物理 foliage. フォリッジ fx. VFX s. ストリーミング wp. ワールドパーティション au. オーディオ
Memory Buckets ひとつのパッケージで 数多あるターゲットデバイスの実装メモリ量から メモリ予算を切り替える仕組み Smallest < Smaller < Default < Larger < Largest [PlatformMemoryBuckets] LargestMemoryBucket_MinGB=32 LargerMemoryBucket_MinGB=12 DefaultMemoryBucket_MinGB=8 SmallerMemoryBucket_MinGB=6 SmallestMemoryBucket_MinGB=0 Windows用 [PlatformMemoryBuckets] LargestMemoryBucket_MinGB=12 LargerMemoryBucket_MinGB=8 DefaultMemoryBucket_MinGB=6 SmallerMemoryBucket_MinGB=4 SmallestMemoryBucket_MinGB=0 モバイル用
Memory Buckets ランタイム動作 ランタイムでランク付けされログに設定状況が出力される コマンドラインオプション MemBucket=4 2=default 3Smaller 4Smallest) で強制オーバーライドが可能 LogHAL: Display: Platform has ~ 7 GB [7958781952 / 8589934592 / 8], which maps to Larger [LargestMinGB=8, LargerMinGB=6, DefaultMinGB=4, SmallerMinGB=3, SmallestMinGB=0) //オーバーライド時 LogHAL: Display: Platform has ~ 7 GB [7958781952 / 8589934592 / 8], but commandline overrode bucket to Smallest
Android 起動引数の書き換え Adb pushを使ってUECommandLine.txtを書き換え 同じようにデバイスプロファイルも DeviceProfile=[プロファイル名 ] でオーバーライドすることができる echo MemBucket=4 > UECommandLine.txt adb push UECommandLine.txt "/sdcard/Android/data/[com.MyCompany.MobileDeepDive]/files/UnrealGame/[MobileDeepDive]/UECommandLine.txt" echo DeviceProfile=Android_High MemBucket=3 > UECommandLine.txt adb push UECommandLine.txt "/sdcard/Android/data/[com.MyCompany.MobileDeepDive]/files/UnrealGame/[MobileDeepDive]/UECommandLine.txt"
Memory Buckets による調整 ● TextureLODGroups ○ MaxLODSize_Smallest / MaxLODSize_Smaller ○ LODBias_Smallest / LODBias_Smaller ● CVars ○ CVars_Largest ~ CVars_Smallest +TextureLODGroups=(Group=TEXTUREGROUP_World, MaxLODSize=1024, MaxLODSize_Smaller=512, MaxLODSize_Smallest=256 +TextureLODGroups=(Group=TEXTUREGROUP_Weapon, LODBias=0, LODBias_Smaller=1, LODBias_Smallest=2 +CVars_Largest=r.Streaming.PoolSize=700 +CVars_Larger=r.Streaming.PoolSize=500 +CVars_Default=r.Streaming.PoolSize=300 +CVars_Smaller=r.Streaming.PoolSize=150 +CVars_Smallest=r.Streaming.PoolSize=75 ) )
テクスチャの用途に合わせたグループごとに最大解像度や MIPBIAS を記述 TextureLODGroups ● MaxLODSize : 最大のテクスチャ解像度 ● MipBIAS : テクスチャをMipレベルを操作 ○ 1を設定すると解像度が半分に ○ クック時およびランタイムの両方に影響 ● OpitionalMips : 指定より大きいテクスチャを 高解像度テクスチャとしてパッケージ分離する プラットフォーム 最大解像度 MIP BIAS OptionalMips Windows 4096 0 4096(pak分離なし) Console 4096 0 2048 iOS 1024 1 256 Android 1024 1 256
TextureLODGroups 設定例 [Mobile DeviceProfile] +TextureLODGroups=(Group=TEXTUREGROUP_World, MaxLODSize=1024,OptionalMaxLODSize=128,MaxLODSize_Smaller=512,MaxLODSize_Smallest=256) 最大解像度を 1024pixelに制限 パッケージにここまで含める 128pixel以上の解像度のテクス チャを別パッケージに分離 MemoryBucketsに応じて ストリーミングする解像度を制限 +TextureLODGroups=(Group=TEXTUREGROUP_WorldNormalMap, MaxLODSize=1024,OptionalMaxLODSize=128,LODBias=1,LODBias_Smaller=2) このプラットフォームでは 解像度を一段階下げる +TextureLODGroups=(Group=TEXTUREGROUP_WorldSpecular, MaxLODSize=256,OptionalMaxLODSize=128) このグループはモバイルでは 影響が小さいので小さなテクスチャに制限 +TextureLODGroups=(Group=TEXTUREGROUP_Character, MaxLODSize=1024,MaxLODSize_Smaller=512) キャラクターは OptionalMaxLODSize無し MemoryBucketsに応じて さらにもう一段階下げる
ストリーミングプールサ イズ ストリーミングアセットに割り当てられるメモリ利用を指定する ストリーミング不可に設定されているテクスチャによって 圧迫されることに注意 ● ● ● stat streaming listtextures nonstreaming listtextures uncompress +CVars_Largest=r.Streaming.PoolSize=700 +CVars_Larger=r.Streaming.PoolSize=500 +CVars_Default=r.Streaming.PoolSize=300 +CVars_Smaller=r.Streaming.PoolSize=150 +CVars_Smaller=r.Streaming.MaxTempMemoryAllowed=30 +CVars_Smallest=r.Streaming.PoolSize=75 +CVars_Smallest=r.Streaming.MaxTempMemoryAllowed=15
MemBucket=Larger ストリーミングプールサ イズ MemBucket=Smallest
DetailMode 設定された詳細レベルでコンポーネントを消す機能 基本ランタイムで動作するコンソール変数だが r.CookOutUnusedDetailModeComponents 1 でクック時にも判定させてコンポーネントを削除できる +CVars=r.CookOutUnusedDetailModeComponents=1 ;Middle以上のDetailModeを持つコンポーネントはロードしない ; 0=Low 1=Mid 2=High 3=Epic +CVars=r.DetailMode=0
フォリッジ最適化 ランドスケープグラスやフォリッジに対して調整を加える ● ● ● densityScale : 密度を乗算 CullDistanceScale : カリング距離を乗算 DiscardDataOnLoad : ロード時にすべてを破棄 +CVars_Smaller=grass.densityScale=0.25 +CVars_Smaller=grass.CullDistanceScale=0.5 +CVars_Smallest=grass.DiscardDataOnLoad=1 +CVars_Smaller=foliage.densityScale=0.25 +CVars_Smaller=foliage.CullDistanceScale=0.5 +CVars_Smallest=foliage.DiscardDataOnLoad=1
スタティックメッシュ / スケルタルメッシュ のプラットフォーム設定 エンジンのデフォルト動作 プラットフォーム毎に最小 LODを設定できる このようなプラットフォーム毎に調整可能な値はプロパティの右に ボタンが置かれている
スタティックメッシュ / スケルタルメッシュ のクオリティ設定対応 アセット毎にクオリティレベルに対応した最小 LODを設定できる ※プロジェクト設定の変更が必要 +CVars=r.StaticMesh.MinLodQualityLevel=2 ;Smaller = Midium設定 +CVars_Smaller=r.StaticMesh.MinLodQualityLevel=1 +CVars_Smallest=r.SkeletalMesh.MinLodQualityLevel=1 ;Smallest = Low設定 +CVars_Smallest=r.StaticMesh.MinLodQualityLevel=0 +CVars_Smallest=r.SkeletalMesh.MinLodQualityLevel=0
バーチャルテクスチャ 巨大なテクスチャをタイル状に分割し必要な部分だけロード GPUのコストと引き換えに高解像度と省メモリ性を獲得 モバイルデバイス上でも設定により動作可能だが追加の GPU負荷 ● ● ● r.VT.PoolSizeScale r.VT.PlaybackMipBias TextureLODGroupのVT用最大解像度設定
バーチャルテクスチャ の注意点 VTのあるなしをプラットフォーム毎に切り替えると カラースペースの互換性に問題がある VTを使うなら全てのプラットフォームで有効にする マテリアルのVirtualTextureSwitchで VT無しプラットフォームをケアする必要がある か
ワールドパーティション オープンワールドを作成するためのワールド分割機能 タイトル毎に複数の分割グリッドが定義される ● 例 ○ ○ ○ メイングリッド (HLODあり) ランドスケープグリッド 小物グリッド (読み込み距離短め HLOD無し) UE5.6からワールドパーティションの ロード高速化プラグイン FastGeoが追加 Unreal Engine 5.6 最新アップデート - オープンワールドで60FPSを達成するための最適化 https://www.docswell.com/s/EpicGamesJapan/KWM1EQ-CEDEC2025-ue5_6update
ワールドパーティション
の調整
ロード範囲を調整する場合には
グリッド毎に設定が必要になるので
タイトルのグリッド設定に合わせてコンソール変数を自作する
int32 MainGridLoadingRange = -1;
int32 MainGridLoadingRange = -1;
FAutoConsoleVariableRef CVarMainGridLoadingRange(
FAutoConsoleVariableRef CVarSubGridLoadingRange(
TEXT("MyApp.MainGrid.Range"), MainGridLoadingRange, TEXT("main grid range."));
TEXT("MyApp.SubGrid.Range"), SubGridLoadingRange, TEXT("sub grid range."));
void SetupLoadingRangeOverride()
{
UWorldPartitionSubsystem::SetOverrideLoadingRange( MainGridName, MainGridLoadingRange);
UWorldPartitionSubsystem::SetOverrideLoadingRange( SubGridName, SubGridLoadingRange);
}
その他の最適化に 利用可能なコンソール変数 r.FreeSkeletalMeshBuffers 1 メインメモリ上にあるメッシュのコピーを削除する メッシュマージなどの機能が不要であれば削除可能 r.DiscardUnusedQuality 1 マテリアルのうち利用するクオリティレベル以外を破棄する 設定でマテリアルクオリティを変更しないのであれば適用可能 r.PSOPrecaching=0 r.ShaderCodeLibrary.PreloadShaderMaps=0 PSOキャッシュやプリロードを無効化することでメモリを削減する r.OpenGL.EnableProgramLRUCache=1 r.OpenGL.ProgramLRUEvictTimeSeconds=20 r.Vulkan.EnablePipelineLRUCache=1 r.Vulkan.PSOLRUEvictAfterUnusedFrames=1000 一定時間使っていないシェーダーをアンロードできるようにする p.RigidBodyNode=0 p.ClothPhysics=0 高価な物理シミュレーションを一括で無効化する p.gc.GlobalMaxSimulatedLevel=1 p.Chaos.GC.RemovalTimerMultiplier=0.5 破砕シミュレーションの破砕深度(分割レベル)を設定 破砕した破片が消えるまでの時間を設定
まとめ ● アンリアルエンジンはハイエンドだけでなくモバイルにも注力 ● モバイルに最適化されたアップデート ○ プロファイリング機能 ○ アンチエイリアシング ○ ライティング ○ などなど ● デバイスプロファイルによって幅広いデバイスに柔軟に対応