관련 링크

https://github.com/Team-def/recre-backend/pull/104

https://github.com/Team-def/recre-backend/issues/87

web socket latency 관련 블로그 (3-way)

socket.io latency 계산식 (1-way)

cloudflare.com - what is latency

문제상황

게임플레이에 지장을 줄 정도로 판정이 가혹했습니다. 지연시간을 생각하지 않아 stop 이벤트 이전에 발송된 run이 뒤늦게 도착해 게임오버가 되는 경우가 발생했습니다.

해결방안

지연시간이 존재하면 극복하면 되는 법. 플레이어 클라이언트가 주기적으로 서버에 ping 이벤트를 보내 서버가 응답한 acknowledgement를 받을때까지의 시간을 구합니다. 이 시간을 Round Trip Time, 줄여서 RTT라고 부릅니다. RTT는 client → server → client 2-way이기 때문에 이를 절반으로 나누어야 1-way 지연시간을 구할 수 있습니다.

Untitled

Show Me the Code

client:

setInterval(() => {
  const start = performance.now();
  socket.emit("ping", {start}, (res: {start: number}) => {
    const end = performance.now();
    const latency = (end - res.start) / 2;
    setLatency(latency);
    console.log(`latency: ${latency}ms`);
  });
}, 2000);

server:

@SubscribeMessage('ping')
ping(client: Socket, payload: { start: number }) {
    return { start: payload.start };
}