Study/Project

나만무 슬레이어즈 9

에린_1 2024. 5. 4. 22:30
728x90

나만무

문제. 패킷이 잘려서 json parsing이 안되는 상황

게임을 진행하다가 서버에서 SyntaxError : Unexpected token가 뜨는 상황이 발생했다.

서버의 로그를 확인해보니 패킷이 잘려있는 문제를 확인했다.

가설 1. 클라이언트 문제

가설 2. 서버 문제

가설을 토대로 생각을 해보니 서버 문제라는 것을 찾을 수 있었다.

클라이언트와 서버 연결을 하고 있는 TCP의 경우 네이글 알고리즘(Nagle’s Algorithm)에서 작은 패킷들을 모아서 전송하기 때문에 패킷이 뭉쳐서 서버에 들어왔다.

기존 서버의 패킷 처리 방식에서는 뭉쳐있는 패킷을 받을 경우, 맨 앞의 데이터만 처리하고 이외의 데이터는 버리도록 코드를 작성했다. 그리고 이러한 스트림에 패킷이 잘려서 들어온 경우 대응이 불가능했다.

해결

for(let i = 0; i < msg.length-1; ++i) {
	const jsonData = JSON.parse(msg[i]);
  const protocol = jsonData.type;
  
  switch(protocol){
   ...
  }
}
recvData = '';
recvData += msg[msg.length-1];

뭉친 패킷을 수신해도 모두 처리할 수 있게 반복문을 사용하고, msg의 마지막은 잘린 패킷일 수 있기 때문에 패킷을 더 받을 수 있게 처리했다.

레이턴시 문제

레이턴시가 너무 크게 나오는 문제가 발생했다.

여러 가설을 세우고 그에 따른 해결책들을 적용하면서 레이턴시를 줄여보았다.

Debug.log 사용 줄이기

디버그를 위해서 debug.log를 남발해서 사용했는데, 유니티의 Debug.Log의 경우 문자열을 생성하고, 콘솔에 출력하는 부분에서 주 스레드에서 생성이 되므로 프레임 레이트가 저하되고 레이턴시가 증가하는 결과를 낳았다.

→ 예외처리나 적게 호출되는 debug는 남겨놓고, 디버그를 위한 Debug를 지움으로 해결했다.

→ 게임을 조금 진행하면 바로 레이턴시가 엄청 튀는 현상이 있었는데 24초 정도에서 12초정도로 50% 정도 줄일 수 있었다.

MessageQueue 사용

코루틴을 사용해서 서버와 통신하던 코드를 분산처리 하도록 만들었다.

코로틴의 경우 유니티의 메인 스레드에서 실행되므로, 코루틴 내에서 긴 작업을 수행하면 메인 스레드가 블로킹되어 성능 저하가 발생할 수 있기 때문에 MessageQueue를 사용했다.

비동기 처리를 사용하면 작업을 메인스레드를 블로킹 시키지 않고 진행할 수 있기 때문에 async와 await를 사용했다.

결과

→ 레이턴시 문제를 많이 해결할 수 있었다.

→ 원래는 1바퀴정도를 지났을 때부터 레이턴시가 튀어서 계속 레이턴시가 증가했는데, 가장 커져도 3초 정도만 나오고 1초정도에서 계속 유지가 됐다.

728x90

'Study > Project' 카테고리의 다른 글

나만무 슬레이어즈 11  (0) 2024.05.08
나만무 슬레이어즈 10  (0) 2024.05.08
나만무 슬레이어즈 8  (0) 2024.05.04
나만무 슬레이어즈7  (0) 2024.05.03
나만무 슬레이어즈6  (0) 2024.05.03