BLOGブログ

2019.02.13UE4

[UE4] マルチプラットフォームを目指すためのDeviceProfilesについて

執筆バージョン: Unreal Engine 4.21

さて、今回はDeviceProfilesについてご紹介したいと思います。
皆さんご存知の通り、UE4は様々なプラットフォームやデバイスでゲームが動くように作られています。
WindowsやMacなどのPC(Desktop)、PS4やSwitchなどの家庭用ゲーム機(Console)、そしてAndroidやiOSなどのスマホやタブレット(Mobile)など多岐にわたります。
対応するプラットフォームやデバイスが多ければ、それだけ多くの人に手に取ってもらえる機会が増えるというもの。
せっかく作ったゲーム、であればより多くの人に遊んでもらいたいと思うのはゲーム開発者として自然な流れではないでしょうか?
今回ご紹介するDeviceProfilesは、そんなゲームのマルチプラットフォーム化には欠かせない機能となっています。

DeviceProfilesとは

簡単に説明すると、描画回りの設定などを各デバイスごとに指定して、設定した値を上書きする事ができる機能です。
例えば、ベースとしてPC用に開発していたゲームがあり、あるTextureGroupのLOD最大サイズを4096×4096に指定していたとします。
ですがこれはConsoleだと少し大き過ぎますし、Mobileでは大き過ぎな気がします。
そこで、例えばPS4なら2048×2048、Switchや最新のスマホなら1024×1024、少し前のスマホなら512×512といった具合に、デバイスごとに細かく再指定できるというわけです。

公式ドキュメントはこちらになります

http://api.unrealengine.com/JPN/Platforms/DeviceProfiles/

こちらを見てわかると思いますが、iniファイルに書き込むことで設定の上書きが可能になっています。
ですが、iniファイルだけではどの設定をどう指定していいか少し分かりにくいですね。
そこで便利なのがエディタ上から指定できるようになるDeviceProfilesのGUIです。

DeviceProfilesのGUIの使い方

GUIは、「Window -> Developer Tools -> Device Profiles」になります。

DeviceProfilesを開いたら、設定したいデバイスを探して、CVarsのアイコンをクリックします。

選択したデバイスの設定画面が表示されるので、ここで値を設定してきます。
例えばマテリアルのクオリティレベルを変更したいとします。
その場合は、Renderingの設定用配列に新しく「r.MaterialQualityLevel」を追加します。

このように設定可能なコマンドの一覧から探すことができるのでとても分かりやすいです。

項目を追加したら数値を変更します。

ここで設定した値は「[Project Dir]\Saved\Config\Windows\DeviceProfiles.ini」に保存されます。
プロジェクトをバージョン管理しているのでSavedフォルダ以下では困るという方は、「Save as Default」で保存します。
するとデフォルト値として「[Project Dir]\Config\DefaultDeviceProfiles.ini」に保存されるので、こちらをバージョン管理に含めれば大丈夫です。

CVarsに関して

こうしてデバイスごとに細かくConsoleVariablesを設定できる事はわかりましたが、ではいざ設定するとなると項目が多くて何から手を付けていいのやらとなるかもしれません。
そんな時に参考になるのがこちらの公式ドキュメントになります。

http://api.unrealengine.com/JPN/Engine/Performance/Scalability/ScalabilityReference/

どの設定でどんな値にすれば負荷が減るのかなど各機能ごとに説明されています。

実際に各デバイスでどの処理がボトルネックになるのかプロファイリングで調査しつつ、それらボトルネックとなりうる原因をピンポイントで設定変更していけば、効率よく各デバイスごとに最適な値が導き出されるのではないでしょうか。

Parent設定について

DeviceProfilesを見てわかる通り、デバイスの数は大量にあり、これらを一つずつ細かく設定していくのはなかなか骨が折れる作業です。
そこでまず最初に大まかな設定しておき、その設定を引き継いで更に細かく設定を変更するような仕組みが存在します。

例えばiOSで大まかな設定をしておき、iPadやiPhoneはその設定を元にして細かく設定を変更。必要であれば更にiPadAirだったりiPadMini用に設定を変更します。
これらの設定はデフォルトで既にある程度元となる設定、Base Profile Nameが指定されていますので、必要な場合に必要なデバイスのみBase Profile Nameを変更するとよいでしょう。

変更する場合は「Select Parent」でプルダウンメニューから元となる設定のデバイスを選択します。

ちなみにですが、「Windows」デバイスはエディタでの起動時を含めた状態で、「WindowsNoEdior」はランタイム(ゲーム本体のみ)時のみの設定になります。
ですので、エディタ上でのみ設定を変えて、Windows版のパッケージにはその設定を反映させたくない設定が大量にある場合は、いっその事WindowsNoEdiorのBase Profile Name を別に用意するという手段もあります。

Texture LOD Settings について

DeviceProfilesで指定できるパラメーターについて、テクスチャのLOD設定があります。
全てのテクスチャにはTextureGroupという管理用のグループ指定が設定してありますが、そのグループごとにLOD設定を細かく指定できる機能です。
逆に言えばグループ指定がきちんとされていないと意図しない設定が適応されてしまう事になるので注意して下さい。
たとえば背景用のテクスチャにUI用のグループを指定してしまったら、背景にLODが切り替わらなくなった等のトラブルが発生してしまいます。
また、常に画面内の手前にくるプレイヤーキャラクターのテクスチャと、画面の遠くに映る可能性がある敵やNPCに使うテクスチャもグループ分けした方がよさそうです。

そうして各テクスチャを適切にグループ分けできたら、DeviceProfilesを使って各デバイスごとに設定の調整を行います。

余談ですが、TextureGroupの名前をもっと分かりやすく、自分のプロジェクト用に名前を変更したい場合、EnumのDisplayNameの置換機能を使うと分かりやすくなります。
例えばUE4側で用意してある拡張用の「Project Group 01」を変更したい場合は以下のようにDefaultEngine.iniファイルなどに書き込みます。

[EnumRemap]
TEXTUREGROUP_Project01.DisplayName=「好きな名前」

TextureGroupのEnum自体は「[EngineDir]\Engine\Source\Runtime\Engine\Classes\Engine\TextureDefines.h」に宣言されていますので、そちらを参照しながらEnumの表示名を置換していくとよいでしょう。

例)TEXTUREGROUP_Project01.DisplayName=historia_neko_chan

テクスチャのグループ設定画面でプルダウンメニューの内容が更新されている事が確認できます。

こちらはDeviceProfilesの画面です。こちらも無事更新されている事が確認できます。

最後に

今回ご紹介したDeviceProfiles以外にも、マルチプラットフォームをサポートするUE4の機能は他にもあります。
マテリアル内部で処理を分岐するQualitySwitchノードだったり、メッシュ等の各LOD設定ごとの「Desktop/Console/Mobile」別の上書き機能などです。

これらをうまく駆使して、マルチプラットフォーム対応を目指していきましょう。