Snapshot Interpolation

worldclasscitizen·2026년 5월 6일

SSAFY

목록 보기
9/9

Snapshot Interpolation
: 클라이언트는 '지금'이 아니라 '약간 과거'를 렌더링한다.

이미지 출처: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

여는 말

게임을 개발할 땐 모든 플레이어가 같은 화면을 보도록 만드는 것이 중요합니다.

예를 들면,
2P 게임에서 두 플레이어가 서로 다른 시점의 화면을 보고 있다고 가정해 봅시다.

한쪽에서는 총을 맞췄다고 생각했는데,
다른 한쪽에서는 피했다고 생각할 수 있겠죠.

네트워크 통신에서 발생할 수 있는 여러 예측 불가능한 변수를 방지하기 위해서 '지금 당장'을 보여주지 않고 '약간 과거'를 보여주면서 관리하는 '보간'이 필요합니다.


본론

주사율(Hz)

이 과정에서 주사율의 개념이 등장합니다.

주사율(Hz)이란, '1초에 몇 컷을 보여줄 것인가'를 의미합니다.
60Hz라고 하면 1초에 60컷을 보여준다는 의미이고,
120Hz라고 하면 1초에 120컷을 보여준다는 의미입니다.

당연히 주사율이 높을수록 더 부드럽게 보입니다.


Photon Fusion 2에서는 기본적으로 30Hz tick rate를 사용합니다.
상대방에게 송신해야 하는 값들이 약 33.3ms에 한 번씩 상대방에게 전송됩니다.


그렇다면, 내 모니터는 144Hz라서 1초에 144개의 컷을 볼 수 있는데, 서버가 30Hz라는 이유로 내가 보는 화면도 30Hz여야 할까요?

아뇨.
이제 여기서 보간법이 등장합니다.

호스트가 30Hz로 보내는 [Networked] aim 값을 클라이언트는 두 개씩 버퍼에 들고 있습니다.

  • 가장 최근 값
  • 그 이전 값

그리고 이 두 값 사이의 시간축을 frame 단위로 보간(linear 또는 hermite)해서, 매 frame 값을 Render()에 제공하는데요,

예시를 통해 알아 봅시다.

예시

여러분은 2D 횡스크롤 총 게임을 하고 있습니다.
마우스 커서를 옮겨서 캐릭터가 조준하고 있는 에임의 각도를 변경할 수 있습니다.

tick 100에 aim = 30˚,
tick 101에 aim = 45˚

이런 식으로 틱과 틱 사이에 마우스 커서를 이동해서 에임을 다른 곳에 조준했습니다.

이 정보를 받아보는 상대방 입장에서는, aim = 30˚라는 정보 바로 다음에 aim = 45˚라는 정보를 받게 됩니다.


상대방 모니터가 Fusion의 기본 tick rate인 30Hz라면 보간이 필요하지 않습니다. 서버가 데이터를 보내는 속도와 모니터가 출력하는 속도가 동일하기 때문에, 데이터를 받는 대로 출력해서 보여주면 됩니다.

상대방 모니터가 31Hz 이상이라면 보간이 필요해집니다.
144Hz 모니터는 약 4.8 프레임이 들어가서,

30 → 33 → 36 → 39 → 42 → 45

이런 식으로 부드럽게 보여지도록 보간합니다.
네트워크는 30번만 갱신했지만, 화면은 매끄럽게 송출해 주는 겁니다.


내 캐릭터(local)와 상대 캐릭터(remote)는 다르다.

내 캐릭터(Input Authority)

input은 매 frame 캡처 가능하다. Update() 시점에 마우스 좌표를 읽는다.

Fusion은 이걸 30Hz tick에 모아서, NetworkInputData에 담아서 호스트로 보낸다.

근데 내 화면에는 Prediction이 즉시 적용되어 30Hz를 기다리지 않고 자기 input을 자기 시뮬레이션에 반영한다.

호스트가 확정한 값이 돌아오면, reconciliation(prediction과 어긋나면 보정)을 수행한다.

상대 컴퓨터(Proxy)

내 입력이 아니므로, Prediction이 없다.

호스트가 30Hz로 확정해서 보내주는 [Networked] aim만 본다.

두 tick 사이를 Snapshot Interpolation으로 보간한다.


결론

주사율과 관련한 문제라면, 부드러운 게 문제가 아니라 반응성이 문제입니다.
tick과 tick 사이는 sampling하지 않아 두 tick 사이의 60˚ → 30˚ → 60˚는 감지할 수 없습니다.

tick rate를 올리는 건 Fusion의 SimulationConfig에서 60Hz, 120Hz로 올릴 수 있습니다.
다만, 다음과 같은 트레이드오프가 있을 수 있습니다.

  • 네트워크 대역폭이 비례해서 증가
  • CPU 비용 증가
  • Photon Cloud 비용 증가

깨알 정보: 유명한 게임들의 tick rate

  • Apex Legends : 20Hz
  • Fortnite : 30Hz
  • CS2 : 64Hz
  • Valorant : 128Hz

닫는 말

게임에서의 공평한 판정을 위해 네트워크 환경에서 어떤 작업을 수행하는지 궁금했었는데,
그 이면에 보간과 후보정이 있다는 걸 새롭게 알게 됐습니다.

0개의 댓글