2024.11.13 트러블 슈팅

장재영·2024년 11월 13일
0

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과 연결이 끊어졌는지 확인
  • 수정 후, 연결이 강제로 끊어져도 승패 결과가 뒤바뀌지 않는 것을 확인
profile
개발 하고 싶은 비버

0개의 댓글