1. 패킷 송수신
문제점 & 원인 분석
- 프로토버프의 데이터형 제한
- ushort, ubytes 형식 사용 불가
- oneof 형태의 프로토버프 인코딩 / 디코딩 문제
- oneof 형태의 프로토버프는 다양한 형태의 데이터를 하나의 필드로 처리할 수 있지만, 클라이언트와 서버가 동일하게 해석하지 못해 통신 오류 발생
해결 방법
- 수신 시 직접 버퍼를 읽도록 수정 및 페이로드는 약속한 프로토버프로 디코딩
- 클라이언트와 약속한 객체의 이름으로 매핑하여 응답
2. 매칭 시스템
문제점
- 매칭 시작 시 루프에 의해 블로킹되어 다음 패킷 처리 불가
원인 분석
- 유저 검색 루프가 콜 스택에 쌓이게 되고 처리가 되지 않으면서 블로킹 발생
- 따라서 매칭 시스템을 비동기적으로 처리해야 함
해결 방법
- 싱글톤 형식으로 매칭 매니저 구현매칭 인스턴스 내의 큐에 유저를 추가하여 블로킹 없이 유저 탐색 진행
- 콜백 함수로 매칭 처리유저가 매칭 될 시, 콜백 함수가 실행되어 게임세션에 접속
3. 후속 처리 시스템
문제점
- 공통적인 후속 처리를 각 핸들러마다 작성
- 이로 인해 코드의 복잡성 증가 및 가독성 저하 문제 발생
해결 방법
- 후속 처리 매니저 구현
- 후속 패킷을 한 곳에서 일괄적으로 관리하고, 동일 기능의 후속 처리 패킷의 중복 코드를 방지
- 비동기 후속 처리 방식 도입
- await handler()가 작동된 이후에 후속 처리를 확인하고 실행하도록 진행
4. 타워의 초 장거리 공격
문제점
원인분석
- 타워 소환 시 타워ID 없이 생성된 후 서버로부터 타워ID 패킷을 전달받음
- 타워ID 패킷을 서버로부터 할당 받기 전에 몬스터를 공격하면 발생
- 기존 생성된 타워ID와 새로 생성된 타워ID 중복으로 인해 발생
해결 방법
- 서버: 타워ID 중복 회피
- 임시로 타워ID를 1부터 시작
- 클라: 타워ID가 유효한 값일 때만 공격을 허용
- 클라이언트에서 타워ID가 0 또는 null인 경우, 공격에 제한
5. 강제 종료 후 처리
문제점
- 강제로 연결을 끊으면 승패 결과가 뒤바뀌는 문제 발생
원인 분석
- 게임이 정상적으로 끝나고 로비로 이동하기 전, 세션 연결을 종료하면 승패 결과
- Session과 연결을 끊지만, 이를 OnEnd()에서 확인하지 않아 발생한 문제
해결 방법
- OnEnd()에서 Session과 연결이 끊어졌는지 확인
- 수정 후, 연결이 강제로 끊어져도 승패 결과가 뒤바뀌지 않는 것을 확인