넷코드의 함정: 조용히 사라지는 메시지
멀티플레이 버그는 따로 하나의 종족이에요. 충돌도 없고, 오류 로그도 없고, 그냥 아무 일도 일어나지 않아요. 우리 네트워킹 코드에서 가장 좋아하는(?) 함정 두 가지를 경고도 할 겸 재미 삼아 소개할게요.
함정 1: 등록하지 않은 메시지. 우리 네트워크 프로토콜에는 “블록 변경”, “플레이어 이동”, “채팅” 같은 메시지 클래스가 있어요. 새 메시지 종류는 모두 코덱에 등록해야 ID를 받고 직렬화할 수 있죠. 이걸 잊으면 최악의 일이 벌어져요. 전송 호출은 실패하는데, 하필 오류가 조용히 삼켜지는 곳에서 실패하거든요. 충돌도 로그도 없이 기능이 “그냥 안 돼요”. 우리도 여러 번 디버깅하다가 반사적으로 확인하는 습관이 생겼어요. 새 메시지 클래스? 먼저 물어봐요. 등록했나요?
함정 2: 유령 블록. 예를 들어 스크립트가 지형을 바꾸는 것처럼 서버가 블록을 바꾸면, 접속한 모든 플레이어에게 직접 알려야 해요. 브로드캐스트를 잊으면 유령 블록이 생겨요. 서버는 거기에 블록이 있다고 아는데, 클라이언트에는 공기로 보이는 거죠. 플레이어는 보이지 않는 벽에 부딪히거나, 더 나쁘게는 서버에는 이미 없는 자리에 건물을 지어요. 청크를 다시 불러와야 두 세계가 다시 맞아떨어져요.
공통점은 이거예요. 멀티플레이에는 늘 두 가지 진실, 즉 서버의 진실과 클라이언트의 진실이 있고, 둘을 맞춰야 하는 곳은 모두 함정이 될 수 있어요. 그래서 바로 이 동기화를 확인하는 테스트와 새 메시지용 체크리스트를 만들었어요. 화려하진 않지만, 그 뒤로 유령은 드물어졌어요.
댓글