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 대신, 커스텀 넷코드를 작성해 사용했습니다.
기술적 뼈대를 제작하는 게 목표였던 만큼 콘텐츠 구현보다는 기술 구현에 집중했습니다. 그중에서도 게임 동기화, 스루풋 최적화, 패킷 직렬화 및 압축, 멀티스레딩, IOCP, 소켓 프로그래밍 등, 서버 프로그래밍과 관련된 내용들에 초점을 두고 개발했습니다.
개발하며 배운 것들
혼자 맨땅에 헤딩하는 느낌으로 시작한 프로젝트인만큼 부족한 점도 많고, 결국 목표 달성에는 실패했지만, 그만큼 개발 과정에서 얻어간 것들도 많습니다.
- 네트워킹 코드를 구현하며 실시간 비동기 IO의 처리, 멀티스레딩, 버퍼 재활용, 메모리풀, IOCP 등 서버 개발의 기본기를 다질 수 있었습니다.
- 게임이 지향하는 바에 따라 서버의 구조가 어떻게 변화하는지 이해할 수 있었습니다.
- 장르나 개발 방향성에 따라 네트워크 부하, 서버 반응성, 동시 접속자 수까지 수많은 것들이 달라질 수 있고, 달라졌을 때 서버의 구조가 어떻게 변화하는지 직접 구현해보며 체득할 수 있었습니다.
- Server authoritative한 로직 처리를 구현하기 위해 client interpolation, server reconciliation과 같은 다양한 동기화 기법들을 구현해보며 실시간 게임이 어떤 식으로 게임을 동기화하는지, 또 어떻게 더 딜레이가 적게, 더 부드럽게 동기화할 수 있는지 이해할 수 있었습니다.
- 서버 개발과 큰 상관이 없어보였던 요소들 (인풋을 조이스틱으로 하는지 WASD로 하는지, 맵 크기는 얼마나 큰지 등) 이 실제로는 네트워크 부하에 많은 영향을 줄 수 있다는 것을 깨닫게 되었습니다.
- 이 부하를 줄이기 위해 패킷 데이터를 여러 방법으로 압축하고, 비트 단위에서 패킷 최적화를 진행해보며 서버를 최적화하는 경험을 해볼 수 있었습니다.
- 맵이 커지거나 동시 접속자가 많아질 때 서버가 어떤 식으로 Scale-out을 할 수 있는지를 고민해보며, 확장 가능한 서버 구조를 설계하는 것의 중요성을 이해할 수 있게 되었습니다.
- 언리얼 엔진의 소스 코드들을 분석해보며 언리얼이 내부적으로 어떻게 동기화를 유지하고 물리 연산을 처리하는지에 대해 더 깊게 이해할 수 있게 되었습니다. 동시에 이를 제가 필요한 형태에 맞게 수정해보는 경험을 통해 엔진 레벨에서의 프로그래밍 경험을 쌓을 수 있었습니다.
'게임 제작 > Rovenhell (2023)' 카테고리의 다른 글
[Rovenhell] 기술 분석 (0) | 2023.12.08 |
---|