1:52 · unreal · game thread · recv thread · frame

언리얼 클라의 스레드와 렉

이 영상에 나오는 용어 15개.

게임 스레드
언리얼에서 입력 처리, 게임 로직 틱, 패킷 적용을 하는 메인 스레드다. 액터를 바꿀 수 있는 유일한 스레드라 여기가 느려지면 모든 것이 느려진다.
동기 로딩
에셋을 디스크에서 읽는 동안 게임 스레드가 기다리는 로딩 방식이다. 비동기 로딩은 백그라운드에서 읽어 멈춤을 피한다.
러버밴딩
화면 속 캐릭터가 멈췄다가 실제 위치로 끌려가듯 튀거나 빨리 움직이는 현상이다. 밀린 이동을 한꺼번에 적용할 때 생긴다.
렌더 스레드
게임 스레드가 넘긴 장면 정보를 받아 그리기 명령을 만드는 스레드다. 게임 스레드보다 한 프레임 뒤에서 돈다.
리시브 스레드 · 센드 스레드
소켓 입출력만 맡도록 게임 스레드와 따로 둔 스레드다. 게임 스레드가 recv()·send()에서 블록되지 않게 해준다. 언리얼 기본 NetDriver는 게임 스레드에서 소켓을 읽고 보내며, 이 영상의 두 스레드는 자체 소켓 모듈 기준이다.
보간 버퍼
받은 위치를 잠깐 모아두고 타임스탬프에 맞춰 사이 값을 채워 재생하는 버퍼다. 패킷 간격이 고르지 않아도 움직임이 매끄럽게 보인다.
수신 큐 · 송신 큐
네트워크 스레드와 게임 스레드 사이에 패킷을 넘기는 대기열이다. 수신 큐 길이가 늘어난다는 것은 게임 스레드가 받는 속도를 못 따라간다는 신호다.
액터 (UObject)
언리얼에서 캐릭터, 몬스터, 이펙트처럼 월드에 놓이는 객체다. UObject는 그 기반 클래스이며 게임 스레드에서만 안전하게 다룰 수 있다.
예측 이동
서버 응답을 기다리지 않고 클라가 입력을 바로 자기 캐릭터에 반영하는 것이다. 서버 결과가 오면 차이를 보정한다.
틱 (Tick)
게임 로직을 한 번 갱신하는 단위다. 서버는 고정 간격(예: 20Hz, 50ms)으로 돌고, 이 영상에서 클라의 틱은 게임 스레드의 한 프레임이다.
프레임 · FPS
화면 한 장을 만드는 한 바퀴와, 1초에 그 바퀴를 몇 번 도는지다. 1프레임 시간은 1000 ÷ FPS ms로, 60fps는 16.7ms, 15fps는 67ms다.
핸들러
패킷 종류별로 실행되는 처리 함수다. 이동 패킷이면 액터 위치를 바꾸고, 스폰 패킷이면 액터를 만든다.
히치 (Hitch)
평소보다 훨씬 긴 프레임 하나가 튀는 현상이다. GC, 동기 로딩, 대량 스폰이 흔한 원인이다.
GC (가비지 컬렉션)
쓰지 않는 객체 메모리를 회수하는 작업이다. 언리얼 GC는 게임 스레드를 잠시 멈추므로 객체가 많을수록 멈춤이 길다.
RHI · GPU
RHI(Rendering Hardware Interface)는 그리기 명령을 DirectX, Vulkan 같은 그래픽 API로 넘기는 층이고, GPU가 실제로 그린다. 영상에서는 렌더 스레드보다 또 한 프레임 뒤에 처리된다.