입력 지연 최소화의 개념과 중요성
입력 지연(Input Latency)은 사용자의 물리적 입력이 실제 화면 반응으로 나타나기까지의 시간이다. FPS, 격투, 리듬 게임처럼 타이밍이 중요한 장르에서는 10ms의 지연도 체감될 수 있다. 이 지연은 단순히 렌더링 속도만이 아니라, 입력 이벤트가 엔진 내부에서 처리되는 순서와 스레드 간 동기화 방식에 의해 결정된다.
기본적으로 입력 지연은 다음 네 구간으로 나뉜다. ① 하드웨어 입력 인식(키보드·패드·마우스), ② OS 이벤트 큐 대기, ③ 게임 엔진의 입력 처리, ④ 렌더링 파이프라인 출력. 이 중 세 번째 단계인 “엔진 내부 처리”가 개발자가 제어 가능한 부분이다. 엔진이 입력을 프레임 단위로 수집하면, 한 프레임의 대기시간이 그대로 반응 지연으로 누적된다. 이를 줄이려면 입력 큐를 프레임 경계와 독립시켜 비동기 방식으로 관리해야 한다.
프레임 큐 처리 구조와 병목 요소
대부분의 게임 엔진은 입력 이벤트를 큐(queue)에 적재한 뒤, 매 프레임 업데이트 루프에서 순차적으로 처리한다. 이 방식은 안정적이지만, 큐가 렌더링 스레드보다 늦게 비워지면 입력이 한 프레임 뒤로 밀린다. 이를 방지하기 위해 두 가지 전략이 사용된다.
첫째는 입력 프리패치(pre-fetch) 방식이다. 다음 프레임을 렌더링하기 전에 입력을 미리 읽어 버퍼에 저장하고, 로직 업데이트가 시작될 때 바로 사용할 수 있도록 한다. 둘째는 프레임 단축 큐(short frame queue)이다. GPU가 이전 프레임을 처리하는 동안 CPU는 다음 프레임 입력을 준비해 병렬 처리한다. 이렇게 하면 CPU·GPU 간 파이프라인 효율이 높아지고, 입력 지연을 30~50%까지 줄일 수 있다.
그러나 큐가 너무 짧으면 GPU가 다음 프레임 데이터를 기다리는 상황이 발생한다. 이 경우 ‘stutter’가 발생하며 프레임 타임 변동성이 커진다. 따라서 입력 큐 길이는 평균 프레임 타임 대비 약 0.5~0.8 프레임 수준이 이상적이다. 이를 측정하려면 프레임 타이밍 로깅 시스템을 통해 CPU, GPU, Input, Present 각 구간의 시간을 수집하고, 주기적 그래프를 분석해야 한다.
입력-렌더 동기화 설계
입력-렌더 동기화는 지연을 줄이기 위해 반드시 정밀하게 설계되어야 한다. 일반적인 접근은 입력을 “렌더 프레임보다 앞선 타임스탬프”로 처리하는 것이다. 즉, 입력이 들어온 시점의 실제 프레임보다 한 단계 빠른 시간축에 배치하여, 렌더 스레드가 이전 입력을 반영하지 않도록 한다. 이 방식은 ‘렌더 레이턴시 제거(Render Latency Removal)’라 불리며, 대부분의 고성능 엔진에서 채택한다.
다음으로 중요한 개념은 입력 예측(Input Prediction)이다. 네트워크 지연을 보정하기 위해 사용되던 기술이지만, 로컬 환경에서도 예측 알고리즘을 활용해 체감 반응속도를 개선할 수 있다. 예를 들어 캐릭터 이동 입력이 들어오면, 실제 물리 연산 결과를 기다리지 않고 예상 위치를 먼저 반영한다. 이후 결과가 도착하면 오차를 보정한다. 이 기법은 반응성을 높이지만, 과도하면 시각적 불일치가 발생하므로 조정이 필요하다.
입력과 렌더의 타이밍을 맞추기 위해 엔진 내부에서는 ‘타임라인 동기화(Timeline Sync)’ 모듈이 작동한다. 입력, 로직, 렌더 각 스레드는 타임스탬프 큐를 공유하고, 매 프레임 동기화 시점에 동일한 기준 시간을 참조한다. 이렇게 하면 입력과 렌더가 서로 다른 프레임을 참조하지 않으며, 지연 폭을 예측 가능하게 유지할 수 있다.