낮은 지연시간 프레임 동기화

스레드 동기화 방식을 수정하여 입력 지연시간을 크게 단축하는 방법입니다.

Choose your operating system:

Windows

macOS

Linux

빠른 시작을 돕기 위해 이 콘텐츠의 초안 형태를 베타로 제공해 드립니다. 곧 업데이트가 있을 예정입니다!

Low-latency frame syncing (낮은 지연시간 프레임 동기화) 모드는 게임, 렌더링, RHI 스레드, GPU 사이 스레드 동기화 방식을 수정하여 입력 지연시간을 크게 단축하고 제어할 수 있습니다. 이전 엔진 버전에서 게임 스레드와 렌더링 스레드 동기화는 프레임 끝에서 일어났습니다. r.OneFrameThreadLag 콘솔 변수를 활성화하면 (기본값입니다) 게임 스레드가 렌더링 스레드 보다 한 프레임 전체를 앞서가지 않도록 합니다.

플랫폼별 그래픽 드라이버는 보통 Present() 를 호출하는 스레드를 멈춰 표시되는 프레임보다 게임 스레드 실행이 빨라지는 것을 막습니다. 드라이버는 스왑 체인을 채우다가 더이상 공간이 없으면 스레드 호출을 멈출 수 있습니다. UE4 의 병렬 렌더링 도입 전 이 동기화 방식은 정확했는데, 게임 스레드가 렌더링 스레드를 기다리면 그래픽 드라이버 / OS 가 멈췄기 때문입니다.

하지만 병럴 렌더링 도입 이후 Present() 호출을 하는 스레드는 RHI 스레드, 즉 드라이버가 스로틀 조절을 하게 되었습니다. 게임 스레드는 계속해서 렌더링 스레드하고만 동기화하므로, 두 프레임 모두 GPU 보다 훨씬 앞서 가다 사용하던 프레임을 교체(flip)할 수 있게 되었습니다. 이는 rhi.SyncInterval 을 2 로 설정한 30hz 타이틀에서 최악의 경우 입력 지연시간이 최장 130 ms 까지 생길 수 있습니다.

UE4 병렬 렌더링 이전과 같은 입력 지연시간을 얻기 위해서는 게임 스레드를 RHI 스레드에 댛신 동기화시킬 필요가 있습니다. 하지만 여기서 더 나아갈 수 있습니다. vsync 활성화 시 스왑 체인의 동기화 간격, 즉 앞/뒤 버퍼 교체 시기가 정기적으로 예측 가능합니다. 게임 스레드 프레임 시작을 vsync 기준 임의 시점으로 동기화시켜 입력 지연시간을 정확히 제어할 수 있습니다. 이 시점을 신중하게 선택하면 입력 지연시간과 퍼포먼스 사이 균형 지점을 선택할 수 있습니다.

새로운 낮은 지연시간 프레임 동기화 모드에는 r.GTSyncType 라는 (게임 스레드 동기화 대상 스레드) 콘솔 변수가 새로 추가됩니다. 이 콘솔 변수는 새 프레임 동기화 메커니즘의 작동 방식을 정의합니다. 사용되는 값은 다음과 같습니다.

설명

0

게임 스레드가 렌더링 스레드와 동기화합니다 (예전 기본 방식입니다).

1

게임 스레드가 RHI 스레드와 동기화합니다 (병렬 렌더링 이전 UE4 방식입니다).

2

게임 스레드가 밀리초 단위 +/- 오프셋으로 스왑 체인 표현과 동기화합니다.

모드 2 동기화를 달성하기 위해 엔진은 표현되는 프레임에 인덱스를 붙여 트래킹하다 Present() 가 호출되면 드라이버에 전달합니다. 이 인덱스는 각 프레임 정확한 교체 시간을 나차내는 플랫폼 프레임 교체 통계에서 구했습니다. 이 값을 사용하여 다음 프레임 교체 예정 시기를 예측한 다음 그 시점에 맞춰 다음 게임 스레드 프레임을 시작합니다.

rhi.SyncSlackMS 콘솔 변수는 다음 예측 vsync 시간에 적용할 오프셋을 설정합니다. 이 값을 줄이면 입력 지연시간이 줄지만 엔진 파이프라인이 짧아지는 비용때문에 멈춤 현상이 발생해 프레임 속도가 낮아질 확률이 높습니다. 반대로 이 값을 늘리면 엔진 파이프라인이 길어져 멈춤 현상에 강해지지만 입력 지연시간이 늘어납니다.

보통 이 프레임 동기화 시스템을 사용하는 타이틀은 일정한 프레임 속도를 유지한 상태에서 rhi.SyncSlackMS 를 최대한 줄입니다.

예를 들어 30hz 타이틀에 다음과 같은 콘솔 변수 세팅이라면:

  • rhi.SyncInterval 2

  • r.GTSyncType 2

  • r.OneFrameThreadLag 1

  • r.Vsync 1

  • rhi.SyncSlackMS 0

입력 지연시간을 (30hz 에서 두 프레임인) 66ms 이내로 하는 것이 최적일 것입니다. rhi.SyncSlackMS 를 10 으로 올리면 입력 지연시간이 최대 76ms 이내로 나올 것입니다.

r.GTSyncType 2 는 ( rhi.SyncInterval 을 1 로 설정한) 60hz 타이틀에도 통합니다만, 30hz 에 비해 프레임 수가 두 배라 애초에 입력 지연시간이 절반이므로 이점이 눈에 띄지 않습니다.

지원되지 않는 플랫폼에서 r.GTSyncType 2 는 모드 1 로 돌아갑니다.

언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
건너뛰기