-
> 과제 진행 간 완료한 사항 및 문제점과 해결 과정을 정리해보았다.학습 키워드: Node.js, C#, Unity
1. 완료한 과제 진행 사항
1) Latency 측정 기능 구현 완료:
(상세 작업 내용은 위 PR과 연결된 Issue 확인)
추후에 구현될 추측항법을 위한 사전 작업인 RTT 기반 Latency 측정 기능을 구현했다. 인터벌 ID를 모아서 관리해주는 클래스인 IntervalManager의 경우 이전 TCP 과제에서 처럼 class의 field에 생성해두고 해당 세션에서 사용중인 인터벌만 관리하도록 하려고 했으나, 현재 클래스 구현 상태 개선을 고민중인 단계여서 일단 따로 singleton 인스턴스를 만들어서 관리하기로 했다.
2) 던전 Timer 동기화 개선:
며칠 전에 서버에서 시작한 타이머의 시간을 여러 개의 클라이언트에서 동기화하는 작업을 했었다. 더라도 latency와 관계 없이 시간이 많이 밀리는 현상이 종종 있었다.
case TimerType.COUNT_DOWN: { if ((currentTime -= Time.deltaTime) <= 0) { gameObject.SetActive(false); } break; } ... timerText.text = UITimer.FormatElapsedTime(currentTime);
기존에 구현한 타이머는 모든 클라이언트가 씬 로딩을 완료하면 서버에서 보내주는 타이머 시작 시간 타임스탬프(startTime)와 설정된 시간(milliseconds)을 받아와 연산해준 값 (float time = (float) (milliseconds - (now - timestamp)) / 1000)을 UITimer 클래스의 currentTime으로 설정하고 해당 시간부터 위 코드를 사용하여 Time.deltaTime을 빼주는 식으로 동작했었다. 그런데 이 방식은 클라이언트의 상황에 따라 시간 격차가 발생하여 많게는 거의 1~2초 가량 차이나는 일이 종종 있었다.
case TimerType.COUNT_DOWN: { ulong now = (ulong) DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); ulong timediff = now - startTime; float accurateTime = currentTime - (float) (timediff / 1000); if (accurateTime <= 0) { gameObject.SetActive(false); } timerText.text = UITimer.FormatElapsedTime(accurateTime); break; }
코드를 보다가 문득 해결 방법이 떠올랐는데, 현재 서버에서 타이머 시작 시간의 타임스탬프를 보내주고 있으니 클라이언트 또한 현재 시간 타임 스탬프로 해당 값과의 차이를 계산하여 세팅된 시간 milliseconds에서 빼주면 정확한 시간으로 동기화되겠다는 생각이 들어 그대로 구현해봤다.
+ 24-08-08 추가: EC2에 업로드 후 서버 시간이 클라이언트 시간보다 느리면 처음 타이머 시작 패킷을 받을때 overflow가 발생하는 문제를 발견했다. 서버에서 보내주는 timestamp가 ulong 타입이기 때문에 연산이 음수가 되면 ulong의 최대 값으로 바뀌게 되는 것이 원인이다. 일단 임시로 now가 startTime보다 작을 경우의 예외 처리만 해줬는데, 확실한 시간 동기화를 위해 NTP 라이브러리를 사용하는 것을 고려해봐야곘다.
--
REFERENCES:> 프로젝트 repo
728x90'TIL-sparta' 카테고리의 다른 글
스파르타) The Last Rollback (D-19, Node.js 게임 서버 최종 프로젝트) (0) 2024.08.09 스파르타) The Last Rollback (D-20, Node.js 게임 서버 최종 프로젝트) (0) 2024.08.07 스파르타) The Last Rollback (D-22, Node.js 게임 서버 최종 프로젝트) - buffer, bull queue, JSON circular structure (0) 2024.08.06 [WSL] WSL 설치 후 WiFi 연결이 안되는 문제 (Windows 11 Home) (0) 2024.08.04 스파르타) The Last Rollback (D-24, Node.js 게임 서버 최종 프로젝트) (0) 2024.08.03