关于Android项目的自定义设备描述和可扩展性

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

Choose your operating system:

Windows

macOS

Linux

虚幻引擎(Unreal Engine) 使用 设备描述可扩展性设置 逐个硬件自定义渲染设置。可扩展性设置定义了阴影、植被和网格体细节等各项功能的质量级别,将大量不同的设置压缩为一个可轻松缩放的值。接着,设备描述将这些设置映射到与之兼容的设备。

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] 分段下 **BaseDeviceProfiles.ini** 中找到此类规则。应用程序找到匹配所检索设备信息的规则后,其将停止浏览列表并使用该设备描述。

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

+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驱动程序。若满足这两个条件,则视 VulkanAvailable 视为 true

无论是否启用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 中定义的设置。

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

要引用设备描述中的可扩展性值,请使用前缀sg.后跟你想设置的值的名称。例如,若要在设备描述中将ShadowQuality设置为1,可以使用以下设置:

+CVars=sg.ShadowQuality = 1

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

运行时修改可扩展性设置

设备描述所选的初始可扩展性设置只是默认值,可用多种方法在运行时轻松修改可扩展性。

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

出于测试目的,在 虚幻编辑器(Unreal Editor) 中,点击 工具栏 中的 设置(Settings) 下拉菜单,找到 引擎可扩展性设置(Engine Scalability Settings) ,修改游戏中的可扩展性设置。

点击查看大图。

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

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

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

点击查看大图。

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

反映的修改

通过将可扩展性设置的名称作为控制台命令输入,还可以输出可扩展性设置的当前值(无数字值)。例如,若输入 sg.FoliageQuality 并按下Enter键,控制台将打印FoliageQuality的当前值以及上次设置它的位置。

控制台输出

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

虽然可通过蓝图使用控制台命令修改可扩展性设置,但也可通过专用函数将其作为 游戏用户设置(Game User Settings) 的一部分来访问,同时可使用 Get Game User Settings 节点来引用。

点击查看大图。

可同时使用此函数与 UMG 以构建菜单,供用户修改这些设置。利用此设置,用户可按需自定义游戏的图形和性能。

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

在C++中,可以使用静态函数 UGameUserSettings::GetGameUserSettings 访问游戏用户设置。然后可使用其专用get和set函数来获取和设置可扩展性设置中的质量级别。

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

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

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

    //将当前植被质量设置为高。
    UserSettings->SetFoliageQuality(2);
}
本文基于此前的虚幻引擎版本编写,未针对当前的虚幻引擎5.0版本更新过。