끊김을 쫓는 동안 들어온 제보 중에 결이 다른 것이 하나 있었습니다.

상대가 지나갔는데 다시 지나간다

프레임이 튀는 문제로 묶어 두고 있었는데, 아니었습니다.

서버가 준 자리에 그냥 갖다 놓고 있었습니다

원격 플레이어의 위치를 스냅샷에서 받아 그대로 대입하고 있었습니다.

서버 스냅샷은 초당 스무 번쯤 오고, 화면은 예순 번 그립니다. 그대로 대입하면 세 프레임에 한 번만 움직이니 뚝뚝 끊겨 보입니다. 그리고 패킷이 늦거나 순서가 뒤바뀌면 지나갔던 자리로 되돌아갑니다. 제보의 "다시 지나간다"가 그것입니다.

이제 받은 자리는 목표로만 두고 매 프레임 조금씩 다가갑니다. 4m 넘게 벌어지면 (부활이나 순간이동입니다) 그냥 옮깁니다.

되감기용 경로는 그대로 뒀습니다

같은 함수를 되감기 판정도 씁니다. 그쪽은 바꾸면 안 됩니다.

호스트가 사격을 판정할 때 한 프레임 안에서 상대를 과거로 되돌리고 → 쏘고 → 복구합니다. 여기에 부드럽게 다가가는 처리를 넣으면 되돌린 자리에 도착하기 전에 판정이 끝납니다.

그래서 경로를 둘로 갈랐습니다. 보여 주는 자리는 부드럽게, 판정하는 자리는 즉시. 같은 데이터를 쓰지만 목적이 다릅니다.

미끄러지듯 오던 것도 같이 고쳤습니다

원격 플레이어는 속도 값이 0이었습니다. 위치를 대입만 했으니 엔진이 보기에 이 캐릭터는 움직인 적이 없습니다. 그래서 걷는 동작이 안 걸리고 미끄러지듯 왔습니다.

보간하면서 실제로 움직인 거리를 재서 속도로 넣었습니다. 인형에게는 동작 갱신 자체를 안 부르고 있었는데 그것도 이제 부릅니다.

남는 것

이 제보를 끊김으로 분류해 둔 게 며칠이었습니다. 증상이 "화면이 이상하다"로 같아서요.

끊김은 내 컴퓨터가 늦는 것이고, 이건 남의 위치가 틀린 것입니다. 원인이 겹치지 않는데 증상 설명이 겹쳤습니다. 제보를 받을 때 "화면"과 "상대"를 갈라 물었으면 더 빨리 왔을 문제입니다.