Serious Engine 1 소스 코드 분석
개요
- Serious Sam은 멀티플레이어 게임으로 설계되었음.
- 싱글플레이어 캠페인도 멀티플레이어처럼 동작함.
- Serious Engine은 싱글플레이어, 멀티플레이어, 데모 녹화 및 재생을 지원함.
부동 소수점 결정론
- 게임의 동기화를 위해 부동 소수점 연산의 결정론적 동작이 중요함.
- Windows에서만 출시되어 컴파일러 차이로 인한 동기화 문제를 피할 수 있었음.
- FPU 정밀도 차이로 인한 문제를 해결하기 위해 정밀도 가드를 사용함.
틱 vs 프레임
- 게임 로직 틱레이트는 렌더링 프레임레이트와 분리되어 있음.
- 게임 로직은 초당 20틱으로 고정되어 있음.
- 부드러운 움직임과 애니메이션을 위해 보간(interpolation)을 사용함.
네트워크 멀티플레이어
- Serious Engine의 네트워킹 모델은 클라이언트-서버 방식임.
- 서버는 클라이언트로부터 메시지를 받아 처리하고, 관련 정보를 모든 클라이언트에 전달함.
- UDP 프로토콜을 사용하여 패킷을 전송함.
패킷 계층
- UDP 패킷은 순서가 뒤바뀌거나 도착하지 않을 수 있음.
- Serious Engine은 UDP 위에 자체 프로토콜을 구현하여 신뢰성과 패킷 순서를 보장함.
- 신뢰할 수 있는 패킷은 ACK 패킷을 통해 확인됨.
연결 수명 주기
- 클라이언트와 서버 간의 가상 연결을 설정하기 위해 브로드캐스트 패킷을 사용함.
- 서버는 클라이언트에게 고유 식별자를 할당하고, 이를 통해 패킷을 라우팅함.
오프라인 플레이
- 싱글플레이어와 데모 재생은 멀티플레이어의 특수한 경우임.
- 동일한 프로세스 내에서 서버와 클라이언트가 통신함.
메시지 계층
- CNetworkMessage는 스트림처럼 읽고 쓸 수 있는 메시지 추상화임.
- 메시지는 압축될 수 있으며, 기본적으로 LZRW1 압축을 사용함.
- 델타 인코딩을 사용하여 데이터 전송량을 최소화함.
메시지 보안
- 메시지는 암호화되지 않음.
- 채팅 메시지는 평문으로 전송됨.
GN⁺의 의견
-
게임 개발자에게 유용함: Serious Engine의 네트워크 구조와 동기화 메커니즘은 멀티플레이어 게임 개발에 유용한 참고 자료가 될 수 있음.
-
결정론적 동작의 중요성: 부동 소수점 연산의 결정론적 동작을 보장하는 방법은 게임 동기화 문제를 해결하는 데 중요한 요소임.
-
네트워크 프로토콜 설계: UDP 위에 신뢰성과 순서를 보장하는 자체 프로토콜을 구현한 것은 네트워크 프로그래밍의 좋은 예시임.
-
보안 고려사항: 메시지 암호화가 없다는 점은 현대 게임 개발에서 보안 측면에서 고려해야 할 사항임.
-
기술적 도전과제: 초기 2000년대의 네트워크 환경에서 빠른 속도의 멀티플레이어 게임을 구현한 기술적 도전과제를 이해하는 데 도움이 됨.