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

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

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 로 돌아갑니다.

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback