Rovenhell (로벤헬)
개발 기간: 23년 8월 ~ 11월
개발 목적: 취미 겸 기술 역량 향상
개발 환경:
클라이언트 및 게임 로직 서버: 언리얼 엔진 5 (커스텀 넷코드 제작, 언리얼 Replication 사용 X)
미들웨어: Visual C++, IOCP
개발 언어: C++
기술 분석:
https://gamesmith.tistory.com/272
소스 코드:
https://github.com/hagukin/Rovenhell_UE
https://github.com/hagukin/Rovenhell_Middleman
소개
로벤헬(Rovenhell)은 멀티플랫폼 MMO 게임을 Server authoritative하게 구동할 수 있는 서버 아키텍처를 제작해보자는 목표를 가지고 시작한 프로젝트입니다.
게임에 대한 자세한 기술적 분석은 여기서 확인하실 수 있으며, 본 게시글에서는 간략한 내용만 소개합니다.
로벤헬은 이동, 충돌 연산까지 Server authoritative하게 처리하는 것을 목표로 하고 개발되었기 때문에 데디케이티드 서버를 사용합니다. 즉 통상적인 MMO(RPG) 아키텍처와는 거리가 있습니다. 하지만 세션 단위 게임이 아닌 MMO를 지향하기 때문에 서버의 지속가능성과 Scale-out을 염두에 두며 구조를 설계했고, 이 때문에 언리얼 자체 기능인 Replication 대신, 커스텀 넷코드를 작성해 사용했습니다. 굳이 아키텍처를 분류하자면 배틀로얄 장르 같은 대규모 세션 베이스 게임과 통상적인 MMORPG 게임 그 사이 어딘가에 위치한 느낌입니다.
기술적 뼈대를 제작하는 게 목표인 만큼 콘텐츠 구현보다는 기술 구현에 집중했습니다. 그중에서도 게임 동기화, 스루풋 최적화, 패킷 직렬화 및 압축, 멀티스레딩, IOCP, 소켓 프로그래밍 등, 서버 프로그래밍과 관련된 내용들에 초점을 두고 개발했습니다.
개발하며 배운 것들
혼자 맨땅에 헤딩하는 느낌으로 시작한 프로젝트인만큼 부족한 점도 많지만, 그만큼 개발 과정에서 얻어간 것들도 많습니다.
- 네트워킹 코드를 구현하며 실시간 비동기 IO의 처리, 멀티스레딩, 버퍼 재활용, 메모리풀, IOCP 등 서버 개발의 기본기를 다질 수 있었습니다.
- 게임이 지향하는 바에 따라 서버의 구조가 어떻게 변화하는지 이해할 수 있었습니다.
- 장르나 개발 방향성에 따라 네트워크 부하, 서버 반응성, 동시 접속자 수까지 수많은 것들이 달라질 수 있고, 달라졌을 때 서버의 구조가 어떻게 변화하는지 직접 구현해보며 체득할 수 있었습니다.
- Server authoritative한 로직 처리를 구현하기 위해 client interpolation, server reconciliation과 같은 다양한 동기화 기법들을 구현해보며 실시간 게임이 어떤 식으로 게임을 동기화하는지, 또 어떻게 더 딜레이가 적게, 더 부드럽게 동기화할 수 있는지 이해할 수 있었습니다.
- 서버 개발과 큰 상관이 없어보였던 요소들 (인풋을 조이스틱으로 하는지 WASD로 하는지, 맵 크기는 얼마나 큰지 등) 이 실제로는 네트워크 부하에 많은 영향을 줄 수 있다는 것을 깨닫게 되었습니다.
- 이 부하를 줄이기 위해 패킷 데이터를 여러 방법으로 압축하고, 비트 단위에서 패킷 최적화를 진행해보며 서버를 최적화하는 경험을 해볼 수 있었습니다.
- 맵이 커지거나 동시 접속자가 많아질 때 서버가 어떤 식으로 Scale-out을 할 수 있는지를 고민해보며, 확장 가능한 서버 구조를 설계하는 것의 중요성을 이해할 수 있게 되었습니다.
- 언리얼 엔진의 소스 코드들을 분석해보며 언리얼이 내부적으로 어떻게 동기화를 유지하고 물리 연산을 처리하는지에 대해 더 깊게 이해할 수 있게 되었습니다. 동시에 이를 제가 필요한 형태에 맞게 수정해보는 경험을 통해 엔진 레벨에서의 프로그래밍 경험을 쌓을 수 있었습니다.
'게임 제작 > Rovenhell (2023)' 카테고리의 다른 글
[Rovenhell] 기술 분석 (0) | 2023.12.08 |
---|