自定义Android的设备描述和可延展性

设备描述规则和可延展性设置的参考。

Windows
MacOS
Linux

虚幻引擎 利用 设备描述 可延展性设置 在以逐硬件基础自定义渲染设置。可延展性设置定义阴影、植物和网格体细节等各项功能的质量级别,并将不同的设置排列压缩为一个易于缩放的值。设备描述随后将此类设置映射到与其兼容的设备。

Android 拥有大量与特定 GPU系列 匹配的描述文件。本指南将介绍 设备匹配规则、规则编辑方式,以及如何利用可延展性设置创建符合游戏特定需求的描述文件。

配置和优先级顺序

在虚幻引擎的安装目录和项目文件夹中读取 配置 Engine/Config 文件夹设置引擎的基本配置设置。之后,按下列顺序相互覆盖:

配置的优先级顺序

  1. Engine/Config/Base*.ini

  2. Project/Config/Base*.ini

  3. Engine/Config/Android/Android*.ini

  4. Project/Config/Android/Android*.ini

例如,"Engine/Config/Android"中的 AndroidDeviceProfiles.ini 文件优先于"Engine/Config 和 Project/Config"中的 BaseDeviceProfiles.iniProject/Config/Android 中的 AndroidDeviceProfiles.ini 优先于所有上述文件。

Android设备描述

标准Android设备描述为 Android_LowAndroid_MidAndroid_HighAndroid_High 描述文件代表虚幻引擎在高端Android设备上所支持功能的完整范围,而`Android_Low` 代表为低端Android设备设置的最低功能。

由于具有相同GPU的移动设备的性能特征通常类似,因此基于虚幻引擎支持的GPU系列,已对更多特定设备描述进行分类。此类GPU特定设备描述通常会将一个标准描述文件(如 Android_High)映射到特定设备,但有时需准备特殊情况调整。

例如,以下为虚幻引擎4.24中,针对Adreno 5xx设备的设备描述:

BaseDeviceProfiles.ini

[Android_Adreno5xx DeviceProfile]
DeviceType=Android
BaseProfileName=Android_High
+CVars=r.DisjointTimerQueries=1

[Android_Adreno5xx_No_Vulkan DeviceProfile]
DeviceType=Android
BaseProfileName=Android_Adreno5xx
; 在运行Android 7或更早版本的设备上存在数个问题(vulkan子传递、遮挡查询)
+CVars=r.Android.DisableVulkanSupport=1

针对其所有基本设置,标准 Android_Adreno5xx 设备描述继承自 Android_High,仅有一项 rDisjointTimerQueries 覆盖。Android_Adreno5xx_No_Vulkan 描述文件之后继承自标准 Android_Adreno5xx 描述文件,由于旧版Adreno5xx设备上的问题,同时提供另一覆盖来禁用对 Vulkan渲染器 的支持。

根据游戏内容,可能需要在项目的 AndroidDeviceProfiles.ini 中覆盖现有描述文件或提供新描述文件。若需要,可进一步扩展此类GPU特定描述文件以代表此类GPU系列中更多特定设备,也可以完全重写之前定义的描述文件。

设备描述匹配规则

虚幻引擎应用程序启动时将加载运行该应用程序的设备相关信息。应用程序之后将迭代根据此类参数识别设备的规则列表。可在 [/Script/AndroidDeviceProfileSelector.AndroidDeviceProfileMatchingRules] 部分下 <strong>BaseDeviceProfiles.ini</strong> 中找到此类规则。应用程序找到和获取的设备信息匹配的规则时,其将停止浏览列表并使用该设备描述。

该列表中的条目格式如下:

+MatchProfile=(Profile="Profile_Name", Match=( ( Rule 1 ), ( Rule 2 ), (...))

规则本身为采用以下格式的字符串比较:

SourceType=[源字符串], CompareType=[比较类型], MatchString=[要与源字符串进行比较的字符串]

将基于向 SourceType 提供的值,输出 源字符串,系统之后会将 MatchString 与其进行比较。

以下为SourceType的有效值及其相应源字符串输出:

SourceType值

说明

输出示例

SRC_DeviceModel

设备型号。

"Nexus 6"

SRC_DeviceMake

设备制造商。

"NVidia"

SRC_GPUFamily

设备中GPU的GPU系列。

"Adreno (TM) 320","NVIDIA Tegra"

SRC_GlVersion

该设备正在运行的OpenGL版本。

OpenGL ES 3

SRC_AndroidVersion

该设备使用的Android操作系统版本。

任何数值。

SRC_VulkanAvailable

检查打包应用程序时是否已启用Vulkan,以及设备是否支持项目设置中指定的所需Vulkan版本。

若Vulkan不可用,则为`False,若可用则为 true`。

SRC_VulkanVersion

该设备使用的Vulkan版本(若可用)。

任何数值。

SRC_PreviousRegexMatch

前一正则表达式在同一MatchProfile条目中匹配项的值。

正则表达式匹配项之前输出的任何信息。

可用比较类型如下:

比较类型

说明

CMP_Regex

在MatchString中执行使用正则表达式运算符的比较。

CMP_Equal

检查两个字符串的值是否完全相同。

CMP_EqualIgnore

CMP_Equal 相同,但忽略大小写。

CMP_NotEqual

检查两个字符串的值是否不同。

CMP_NotEqualIgnore

CMP_NotEqual 相同,但忽略大小写。

CMP_Less

检查源字符串的数值是否小于MatchString。

CMP_LessIgnore

CMP_Less 相同,但忽略大小写。

CMP_LessEqual

CMP_Less 相同,但若源与MatchString也相等,则返回true。

CMP_LessEqualIgnore

CMP_LessEqual 相同, 但忽略大小写。

CMP_Greater

检查源字符串的数值是否大于MatchString。

CMP_GreaterIgnore

CMP_Greater 相同,但忽略大小写。

CMP_GreaterEqual

CMP_Greater 相同,但若源与MatchString也相等,则返回true。

CMP_GreaterEqualIgnore

CMP_GreaterEqual 相同,但忽略大小写。

例如,以下为4.24中Mali T8xx设备的条目:

BaseDeviceProfiles.ini

+MatchProfile=(Profile="Android_Mali_T8xx_No_Vulkan",Match=((SourceType=SRC_GpuFamily,CompareType=CMP_Regex,MatchString="^Mali\\-T8"),(SourceType=SRC_AndroidVersion, CompareType=CMP_Regex,MatchString="([0-9]+).*"),(SourceType=SRC_PreviousRegexMatch,CompareType=CMP_Less,MatchString="8")))

该MatchProfile条目包含三项规则:

  1. 必须拥有含字符串"^Mali\-T8"的GPU系列的正则表达式匹配项。

  2. Android版本必须有一个或多个位数,发现无位数前将保存该位数。

  3. 第二条规则中获得的Android版本必须小于8。

若满足所有此类条件,将使用描述文件 Android_Mali_T8xx_No_Vulkan

设备描述规则首先由制造商列出,并以最低端规范到最高端规范的升序排列。标准Android描述文件作为备用文件列出,以防无匹配规则或者无法识别特定设备。

若向该列表添加任何规则,请确保按照相对于同一系列中的其他设备的适当顺序放置。

启用Vulkan

名为 VulkanAvailable 的特殊参数将用于识别设备能否使用Android的Vulkan渲染器。其首先检查游戏本身是否启用Vulkan支持,然后检查设备是否拥有Vulkan驱动程序。若满足这两个条件,则视 VulkanAvailabletrue

无论是否启用Vulkan,支持Vulkan的设备都已启用描述文件,以考虑项目不使用Vulkan的项目,即便Vulkan在目标设备上可用。所有描述文件都拥有名为 r.Android.DisableVulkanSupport 的参数,其默认设为 1。启用Vulkan的设备描述将该参数覆盖为 0

由于最早支持Vulkan的设备存在较多驱动程序bug,因此建议仅在运行Android 9或更高版本的设备上启用Vulkan。

可延展性设置

Engine/Config/BaseScalability.ini 中定义虚幻引擎的基本可延展性设置,可在引擎安装目录中找到此类设置。在 Engine/Config/Android/AndroidScalability.ini 中定义Android设备的可延展性设置。

可延展性位置

了解可延展性值

可延展性设置吸收了大量参数,将这些参数压缩到各个类别之下,然后可用0到3之间的简单值进行定义。例如,以下为 BaseScalability.ini 中 ShadowQuality等级0的可延展性映射:

BaseScalability.ini

[ShadowQuality@0]
r.LightFunctionQuality=0
r.ShadowQuality=0
r.Shadow.CSM.MaxCascades=1
r.Shadow.MaxResolution=512
r.Shadow.MaxCSMResolution=512
r.Shadow.RadiusThreshold=0.06
r.Shadow.DistanceScale=0.6
r.Shadow.CSM.TransitionScale=0
r.Shadow.PreShadowResolutionFactor=0.5
r.DistanceFieldShadowing=0
r.DistanceFieldAO=0
r.VolumetricFog=0
r.LightMaxDrawDistanceScale=0
r.CapsuleShadows=0

所有列出值均代表高度特定的功能,且均拥有各自范围。例如,部分操作遵照像素分辨率,部分操作遵照与默认值相乘的缩放因子,而部分操作则更任意。以各功能为基础进行定义十分困难,而且频繁更新硬件,还需在发布之间进行调整。

因此,我们使用ShadowQuality将一组相关设置压缩到当个可读值之下。上述条目定义了将配置文件中 sg.ShadowQuality 设为 0 时所有值的行为方式。ShadowQuality@13 存在类似条目。

以下为此类默认可延展性值的指南:

可延展性值

说明

0

低质量。与虚幻引擎支持的最低硬件范围兼容的最低设置。

1

中等质量。经虚幻引擎测试且介于最低端与最高端设备之间的硬件上适用的设置。

2

高质量。经虚幻引擎测试的最高端硬件上适用的设置。

3

顶级质量。当前虚幻引擎版本中给定功能的最高可能值。

覆盖可延展性设置

要覆盖可延展性设置,可在项目自身的配置目录中创建 AndroidScalability.ini。例如,若有名为AndroidQuickStart的项目,其将被放置在 AndroidQuickStart/Config/Android 中。

项目的可延展性位置

该文件中创建的可延展性设置将优先于 Engine/Config/Android/AndroidScalability.ini 中定义的设置。

设备描述中设置可延展性值

要引用设备描述中的可延展性值,使用要设置的值命名后的prefix sg.。例如,若要在设备描述中将ShadowQuality设为1,可使用以下设置:

+CVars=sg.ShadowQuality = 1

该延展性值后列出的设置将优先于其初始值。但强烈建议在 *Scalability.ini 文件中修改可延展性参数并持续观察可持续性分组,而不是在设备描述中修改小规模参数。此操作可确保编辑器中的 预览渲染级别(Preview Rendering Level) 准确应用移动可延展性值。

运行时修改可延展性设置

设备描述选择的初始可延展性设置为默认设置,通过多种方法可在运行时轻松修改延展性。

在虚幻编辑器中使用设置菜单

针对测试目的,在 虚幻编辑器 中,点击 工具栏 中的 设置(Settings) 下拉菜单并前往到 引擎可延展性设置(Engine Scalability Settings),以修改游戏中的可延展性设置。

点击查看大图。

该菜单中所做变更将立即生效。

使用控制台命令修改可延展性设置

还可将延展性设置作为 控制台命令 引用。例如,若在控制台中输入 sg.FoliageQuality 2 并按下enter键,将相应修改 FoliageQuality下的所有CVars。

点击查看大图。

引擎可延展性设置菜单中的值将反映该修改。

反应的修改

通过将可延展性设置的命名作用控制台命令输入,还可输出可延展性设置的当前值(无数字值)。例如,若输入 sg.FoliageQuality 并按下enter键,控制台将输出FoliageQuality的当前值及其上次设置的位置。

控制台输出

在蓝图中修改可延展性设置

尽管可通过蓝图使用控制台命令修改可延展性设置,但也可通过专属函数将其作为 游戏用户设置 的一部分进行访问,同时可利用 Get Game User Settings 节点进行引用。

点击查看大图。

可同时使用该功能与 UMG 以构建用户可在其中修改此类设置的菜单。利用此设置,用户可按需自定义游戏的图形和性能。

在C++中修改可延展性设置

在C++中,可通过静态函数 UGameUserSettings::GetGameUserSettings 访问游戏用户设置。然后可利用其专用获取和设置函数来获取并设置延展性设置上的质量级别。

#include "MyActor.h"
#include "GameUserSettings.h"

void AMyActor::SampleScalabilityFunctions()
{
    //获取对游戏用户设置的引用。
    UGameUserSettings* UserSettings = UGameUserSettings::GetGameUserSettings();

    //获取当前植物质量。
    Int32 FoliageQuality = UserSettings->GetFoliageQuality();

    //Setting the current Foliage Quality to High.
    UserSettings->SetFoliageQuality(2);
}
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback