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