-
[TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-3)TIL-sparta 2024. 7. 5. 22:17
> 과제 진행 간 완료한 사항 및 문제점과 해결 과정을 정리해보았다.학습 키워드: Node.js, net, TCP, socket, Buffer, Protobuf, latency, dead reckoning
1. 완료한 과제 진행 사항
1) (도전 요구사항) Latency를 이용한 추측 항법 구현 (part 1):
- 위 링크 내 'Latency를 이용한 추측항법 적용' 상위 5개 항목의 구현을 완료 (추후 자기 자신 위치 추측 항법 위치로 동기화 필요)
2. 과제 진행 간 문제점
1) 다른 유저의 캐릭터 위치 업데이트가 되지 않던 문제 (해결):
오전에 GameStart proto message의 이름을 변경하면서 여러 파일을 그에 맞게 수정하고 클라이언트를 실행했는데, 위와 같이 이전 접속 유저의 위치만 보이고 이후 접속 유저 위치가 안보이는 문제가 있었다. 이전 접속 유저(abc)를 움직여도 이후 접속 유저의 클라이언트에서는 위치 업데이트가 되지 않아서 코드 작성에 실수가 있다고 생각했었다.
그런데 원상 복구하고 나서 다시 실행했는데도 여전히 같은 상태여서 LocationUpdate에 무슨 문제가 생겼나 싶어 log를 찍어봤으나 패킷을 정상적으로 생성하고 있었다. 한참을 고민하다가 역으로 되짚어가면서 하나씩 비활성화를 해봤는데, Ping 패킷을 보내는 작업을 비활성화 하고나서 다시 위치 갱신이 정상적으로 동작하는 것을 확인했다.
class Game { ... addUser(user) { if (this.users.length >= gameConstants.MAX_PLAYERS) { throw new Error("Game session is full."); } this.users.push(user); this.intervalManager.addPlayer(user.id, user.ping.bind(user), 1000); // 문제 위치 } ...
원인은 Ping 패킷을 handle하는 클라이언트 코드가 없기 때문에 Buffer에 해소 불가능한 packet이 쌓이면서 location 패킷을 처리할 수 없기 때문이었다. 다른 말로 하면 만들다 말아서 그렇다는 것이다. 클라이언트에 Pong을 구현하는 것으로 해결했다.
2) Ping 패킷 수신 시 deserialization에서 RangeError 발생 (해결):
지난번에도 동일한 문제가 발생했었는데, 이번 경우에는 동일한 proto message 타입을 사용했으나 timestamp의 데이터 타입을 잘 못 지정해줘서 생긴 문제였다. 어제 변경해둔 부분이 오전에 문제를 수정하던 중 git reset을 하면서 초기화되어 있었던 것을 모르고 한참을 헤맸다. Ping의 timestamp는 클라이언트에서 ulong 타입으로 지정되어있기 때문에 서버 또한 마찬가지로 long에 해당하는 uint64를 지정해줘야한다. C#과 JS 간 protobuf 데이터 타입의 변환은 .NET API 문서와 protobufjs NPM 문서를 확인하면 된다.
3. 기타 사항
1) 다른 유저 캐릭터의 초기 로딩 속도가 느림:
이 부분은 이전에 초반 텔레포트 현상을 해결해보려고 코드 순서를 좀 바꿨더니 생긴 문제인데, 게임 세션 참가 코드가 initialHandler에서 모든 처리가 끝날 때 이루어지도록 변경해서 그렇다. 이 부분은 우선순위가 아니므로 추측 항법이 완료되면 수정해보기로 했다.
3) 가만히 있는 다른 유저의 캐릭터가 바라보는 방향이 간헐적으로 바뀜:LocationUpdate로 위치를 수신하여 spawner를 통해 생성된 다른 유저 캐릭터가 바라보는 방향이 간헐적으로 바뀌는 현상이 있다. 소환할 때 방향이 무작위인 이유를 좀 알아봐야 할 것 같은데, 일단은 이 부분도 우선순위는 아니라서 주 요구사항 구현이 끝나고 알아보기로 했다. 만약 원인을 못 찾으면 해당 유저가 바라보던 방향을 기억해서 돌려주는 방법도 고려해봐야겠다.
--
REFERENCES:> 과제 spec
> 과제 repo
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-1) (0) 2024.07.07 [TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-2) (0) 2024.07.06 [TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-4) (0) 2024.07.04 [TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-5) (2) 2024.07.03 [TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-6) (0) 2024.07.02