1P by neo 3달전 | favorite | 댓글 1개

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년대의 네트워크 환경에서 빠른 속도의 멀티플레이어 게임을 구현한 기술적 도전과제를 이해하는 데 도움이 됨.
Hacker News 의견
  • Serious Sam의 네트워크 코드를 구현한 개발자였음. QuakeWorld 예측 시스템에서 영감을 받아 간단한 MVP를 코딩했음.
  • Serious Sam은 LAN 파티에서 항상 잘 작동했음. 다른 게임들이 문제를 겪을 때도 안정적으로 실행되었음.
  • GB Color 포트의 Vigilante 8 멀티플레이어를 결정론적 게임 플레이로 구현했음. GBC 링크 케이블을 사용해 1바이트씩 데이터를 전송했음.
  • Croteam은 매우 재능 있는 게임 개발 팀임. Talos Principle 시리즈와 맞춤형 Vulkan 게임 엔진을 개발했음.
  • Age of Empires의 "1500 archers on a 28.8"와 같은 아이디어인지 질문함.
  • 기술 자원이 증가함에 따라 소프트웨어가 더 느리고 비효율적으로 변하는 현상을 지적함. 이를 "Benjamin Button 소프트웨어 디자인 효과"라고 부름.
  • Factorio의 아키텍처는 입력 이벤트만 전송하고, 동기화된 시뮬레이션 코어에 의존함.
  • Serious Sam을 PC Gamer 데모로 플레이했던 기억을 떠올림. 이제는 클래식 게임으로 여겨짐.
  • Serious Engine의 보간(interpolation) 기능을 설명함. 콘솔에서 net_bLerping=0을 입력해 보간 없이 게임을 플레이할 수 있음.