프레임 페이싱(Frame Pacing) 은 디바이스의 네이티브 새로 고침 속도보다 낮은 프레임 레이트로 애플리케이션의 렌더링 프레임을 제한하는 시스템입니다. 이렇게 하면 애플리케이션이 렌더링 시 일관성과 안정성을 우선시하기 때문에 프레임 레이트 한계가 없는 경우와 비교해 한층 매끄러운 사용자 경험을 만들 수 있습니다. 언리얼 엔진(UE) 의 프레임 페이싱은 프로젝트 환경설정에 포함된 디바이스 프로파일 을 사용하여 디바이스별로 설정할 수 있습니다.
Android용 Swappy 프레임 페이싱
언리얼 엔진은 Android Game SDK 에서 Swappy 프레임 페이싱 라이브러리를 통합합니다. Swappy는 다른 하드웨어에 사용되는 UE의 레거시 프레임 페이서 대신 사용할 수 있는 대안 솔루션으로, UE 5.2 이상부터 디폴트로 활성화됩니다.
Android 하드웨어는 보통 프레임 제출 지연 감지되면 화면 테어링 현상을 막기 위해 과거 프레임을 표시하는 프레임 버퍼를 사용합니다. 하지만 게임 렌더러가 이 프로세스를 인지하지 못해서 동기화가 어긋나고 표시되는 프레임보다 앞서가는 경우가 많습니다. 이렇게 되면 프레임 표시 시간에 상당한 차이가 나타나고, 보통 스톨은 입력이 샘플링된 이후에 이루어지므로 터치스크린 컨트롤에 큰 입력 지연시간이 발생합니다. Swappy는 이 현상을 안정화하기 위해 만들어진 Android용 프레임 페이싱 솔루션으로, 게임의 렌더 사이클과 Android 디바이스의 새로 고침 사이클이 더욱 효과적으로 커뮤니케이션할 수 있도록 도와줍니다.
Swappy 활성화 또는 비활성화하기
레거시 프레임 페이서 대신 Swappy를 사용하는 것이 권장됩니다. Swappy를 비활성화하고 레거시 프레임 페이서를 대신 사용해야 하는 경우 UseSwappyForFramePacing=0 을 사용하려는 Android 프로파일에 추가합니다. Android_Default 에 추가하면 모든 Android 디바이스에 Swappy가 활성화됩니다.
디바이스 프로파일에서 프레임 페이싱 세팅 수정하기
프레임 페이싱은 원하는 디바이스에 포함된 DeviceProfiles.ini 파일의 CVar를 통해 제어할 수 있습니다.
- iOS 디바이스의 경우
[/Script/IOSRuntimeSettings.IOSRuntimeSettings]에서 디바이스 프로파일을 추가할 수 있습니다. - Android 디바이스의 경우
[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]에서 디바이스 프로파일을 추가할 수 있습니다.
프레임 페이싱을 제어하는 파라미터는 아래와 같습니다.
| 파라미터 | 사용 | 설명 |
|---|---|---|
FrameRateLock = [value] |
FrameRateLock=True |
true로 설정하면 모든 프레임 페이싱을 허용합니다. |
bEnableDynamicMaxFPS = [value] |
bEnableDynamicMaxFPS=True |
true로 설정하면 iOS 디바이스에서 120Hz를 허용합니다. Android 디바이스에는 영향을 미치지 않으며, r.setframepace 만 호출해야 합니다. |
r.setframepace [value] |
r.setframepace 60 |
새로 고침 속도를 제공된 값으로 바로 설정합니다. |
a.UseSwappyForFramePacing = [value] |
a.UseSwappyForFramePacing=1 |
디폴트 값은 1입니다. 값을 0으로 설정하면 Google의 Swappy 프레임 페이싱 솔루션이 비활성화되고 표준 UE 프레임 페이서를 대신 사용합니다. Swappy는 UE 프레임 페이서와 동일한 CVar를 사용합니다. |
C++에서 프레임 페이싱 제어하기
C++에서 프레임 페이싱을 제어하려는 경우 FPlatformRHIFramePacer 인터페이스에서 스태틱 함수를 호출하면 됩니다. 스태틱 함수에서 파라미터로 사용하는 프레임 페이스는 32비트 integer로 전달됩니다.
FPlatformRHIFramePacer::SupportsFramePace 는 지정된 프레임 페이스가 현재 디바이스의 새로 고침 속도와 호환되는지 확인합니다. FPlatformRHIFramePacer::SetFramePace 는 페이스를 지정된 integer 값으로 설정하고, FPlatformRHIFramePacer::GetFramePace 는 현재 프레임 페이스를 반환합니다.