게임 렉 백서 › L1 클라이언트 게임 프로세스
메인 스레드 패킷 처리 병목 Network processing on the main thread
원인 ID cg-net-mainthread · 주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
받은 패킷을 프레임마다 정해진 만큼만 처리하면, 몰려온 패킷이 다음 프레임으로 계속 밀립니다.
왜 사람 많은 곳에서 초당 수천 개의 업데이트가 도착 → 그러면 메인 스레드가 프레임당 처리량 제한에 걸려 다 못 읽음 → 화면에서는 다른 사람 움직임이 점점 늦게, 몰아서 반영
- 증상
- 몰아치기, 입력 지연
- 요인
- 정체, 지연
- 누가 겪나
- 특정 장소·채널, 나만
- 언제
- 사람이 몰릴 때
- 담당
- 주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발
- 게임개발팀 할 일
- 클라이언트: 수신·해석은 별도 스레드, 같은 대상의 오래된 위치 업데이트는 합쳐서 최신만 적용. 서버: 사람 많은 곳에서는 먼 캐릭터의 업데이트를 덜 자주 보내 전송량 줄이기.
- 수치 감각
- 처리 못 한 패킷이 쌓이면 1초 분량이 밀리는 데 몇 초면 충분합니다.
- 그래프에서는
- 인원·부하를 따라 오름 · 처리 못 한 수신 패킷 수, 수신~적용 지연
- 확인할 곳
- 클라이언트가 프레임마다 처리하지 못하고 남긴 패킷 수와, 패킷이 도착한 시각부터 게임에 적용한 시각까지의 지연을 로그로 남겨 주변 인원과 함께 봄
- 이러면 맞음
- 사람 많은 곳에서 남은 패킷 수와 적용 지연이 계속 늘고 같은 시각 핑과 서버의 송신 간격은 정상임
- 이러면 아님
- 적용 지연은 없는데 패킷 자체가 늦게 도착하면 네트워크 구간. 프레임 시간이 크게 오르면 “대규모 인원 렌더링 부하”
- 확인 수단
- 게임 서버·클라이언트의 로그·지표가 필요
출처
- Actor Priority in Unreal Engine Epic Games
대역폭이 모자라면 모든 액터를 매번 복제하지 않고 보는 사람과의 거리·마지막 복제 후 시간으로 우선순위를 매김 - Replication Graph in Unreal Engine Epic Games
접속자·복제 대상이 많은 게임(MMORPG 등)은 위치별로 묶어 필요한 대상만 보내야 서버 CPU 병목을 피함
함께 보면 좋은 원인
같은 층: L1 클라이언트 게임 프로세스
같은 증상(몰아치기)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기