Android용 디바이스 프로파일 및 엔진 퀄리티 커스터마이징

디바이스 프로파일 규칙과 엔진 퀄리티 세팅에 대한 레퍼런스입니다.

언리얼 엔진 에서는 디바이스 프로파일엔진 퀄리티 세팅 을 사용하여 하드웨어별로 렌더링 세팅을 커스터마이징합니다. 엔진 퀄리티 세팅은 섀도, 폴리지, 메시 디테일과 같은 요소의 퀄리티 수준을 정의하며, 다양한 세팅이 하나의 값으로 통합되어 있기 때문에 쉽게 조절할 수 있습니다. 디바이스 프로파일은 이러한 세팅을 호환되는 디바이스에 매핑합니다.

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.ini 파일보다 우선시됩니다. Project/Config/Android 에 있는 AndroidDeviceProfiles.ini 파일은 위의 모든 파일보다 우선합니다.

Android 디바이스 프로파일

표준 Android 디바이스 프로파일은 Android_Low, Android_Mid, Android_High 입니다. Android_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=( ( 규칙 1 ), ( 규칙 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을 사용할 수 있는 경우 디바이스에서 사용하는 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 과 유사하나 대소문자를 무시합니다.

예를 들어, 아래는 Mali T8xx 디바이스에 대한 4.24 엔트리입니다.

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. GPU 제품군에 대해 "^Mali\-T8" 스트링을 가진 정규식 일치가 존재해야 합니다.

  2. Android 버전은 자릿수가 하나 이상이어야 하며, 자릿수가 아닌 경우(non-digit)가 발견될 때까지 자릿수를 기억합니다.

  3. 두 번째 규칙에 따라 획득한 Android 버전은 8 미만이어야 합니다.

모든 기준을 만족하면 Android_Mali_T8xx_No_Vulkan 프로파일을 사용합니다.

디바이스 프로파일 규칙은 먼저 제조사에서 나열하며, 이후에는 저사양부터 고사양까지 오름차순으로 제공됩니다. 어떠한 규칙도 만족하지 못해서 디바이스를 구체적으로 식별할 수 없으면 예비 프로파일로 표준 Android 프로파일이 나열됩니다.

이 목록에 규칙을 추가할 때는 동일한 제품군의 다른 디바이스를 기준으로 적절한 순서에 따라 배치해야 합니다.

Vulkan 활성화하기

VulkanAvailable 은 디바이스에서 Android Vulkan 렌더러를 사용할 수 있는지 파악할 때 사용하는 특수 파라미터입니다. 이 파라미터는 우선 게임 자체에 Vulkan 지원이 활성화되어 있는지 확인한 다음, Vulkan 드라이버가 있는지 확인합니다. 두 조건이 모두 만족되면 VulkanAvailabletrue 로 간주됩니다.

대상 디바이스에서 Vulkan을 사용할 수 있지만 사용하지 않는 프로젝트도 존재할 수 있으므로 Vulkan을 지원하는 디바이스에는 Vulkan 활성화 프로파일과 비활성화 프로파일이 모두 있습니다. 모든 프로파일에는 기본적으로 1 로 설정된 r.Android.DisableVulkanSupport 라는 파라미터가 있습니다. Vulkan 활성화 디바이스 프로파일은 이 파라미터를 0 으로 오버라이드합니다.

Vulkan을 지원하는 초기 디바이스의 경우 드라이버에 일부 버그가 존재하므로 Vulkan은 Android 9 이상의 디바이스에서만 활성화하는 것을 권장합니다.

엔진 퀄리티 세팅

언리얼 엔진의 베이스 엔진 퀄리티 세팅은 엔진 설치 디렉터리에 있는 Engine/Config/BaseScalability.ini 파일에 정의되어 있습니다. Android 디바이스의 엔진 퀄리티 세팅은 Engine/Config/Android/AndroidScalability.ini 에 정의되어 있습니다.

엔진 퀄리티 위치

엔진 퀄리티 값 이해하기

엔진 퀄리티 세팅에 있는 수많은 파라미터는 큰 카테고리로 분류되어 있으며, 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

나열된 값은 각각 특정 기능을 나타내며 스케일이 저마다 다릅니다. 예를 들어, 어떤 값은 픽셀 해상도를 조절합니다. 어떤 값은 디폴트값에 배수로 적용되는 스케일 인수를 조절하고, 어떤 값은 보다 임의적입니다. 기능마다 따로 정의해야 한다면 작업이 아주 번거로워지고, 자주 업데이트되는 하드웨어의 특성상 출시할 때마다 값을 조절해야 합니다.

따라서 엔진 퀄리티 세팅에서는 사람이 쉽게 알아볼 수 있는 하나의 값을 사용하여 관련 세팅들을 하나의 그룹으로 묶었습니다. 위 엔트리는 환경설정 파일에서 sg.ShadowQuality0 으로 설정되어 있을 때 각 값의 행동을 정의합니다. ShadowQuality@1 ~ 3 도 비슷한 엔트리가 있습니다.

아래는 엔진 퀄리티 세팅의 디폴트값에 대한 가이드입니다.

엔진 퀄리티 값

설명

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) 이 모바일 엔진 퀄리티 값을 정확하게 적용할 수 있습니다.

런타임에서 엔진 퀄리티 세팅 변경하기

디바이스 프로파일이 선택하는 최초 엔진 퀄리티 세팅은 디폴트값입니다. 이 세팅은 런타임에서 다양한 방식으로 변경할 수 있습니다.

언리얼 에디터의 세팅 메뉴 사용하기

테스트용으로 언리얼 에디터 에서 툴바**의 세팅(Settings) 드롭다운을 클릭한 뒤 엔진 퀄리티 세팅(Engine Scalability Settings)** 을 선택해서 게임의 퀄리티 세팅을 변경할 수 있습니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

이 메뉴에서 변경한 내용은 즉시 적용됩니다.

콘솔 명령으로 엔진 퀄리티 세팅 변경하기

콘솔 명령 으로도 엔진 퀄리티 세팅을 확인할 수 있습니다. 예를 들어, 콘솔에 sg.FoliageQuality 2 를 입력하고 엔터를 누르면 이에 따라 FoliageQuality 아래의 모든 CVar 값이 변경됩니다.

이미지를 클릭하면 최대 크기로 볼 수 있습니다.

엔진 퀄리티 세팅 메뉴의 값에도 이 변경사항이 적용됩니다.

반영된 변경사항

숫자 값 대신 이름을 콘솔 명령으로 입력해서 엔진 퀄리티 세팅의 현재 값을 출력할 수도 있습니다. 예를 들어, sg.FoliageQuality 를 입력하고 엔터를 누르면 콘솔이 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 버전을 위해 업데이트되지 않았습니다.