과거 게임서버 구현은 C++을 사용하여 구현하는 경우가 대부분이었습니다.
그러나 최근 모바일 류 게임들 중 실시간성이 중요하지 않은 경우, 개발 생산성과 인력 수급에서 유리한 C#, Java 등을 사용하여 서버를 구현하는 경우가 늘고 있습니다.
그럼에도 MMORPG 같이 실시간성이 중요한 경우, 여전히 C++로 서버를 구현하는 경우가 많습니다.
턴제, 방치형 게임처럼 서버가 사용자의 요청(사용자 이벤트)이 왔을 때만 일을 하면 되는 경우에는 실시간성이 크게 중요하지 않으며, 이러한 서버를 이벤트 기반 서버라 부릅니다.
MMORPG처럼, 서버가 사용자의 요청이 없어도 계속해서 플레이어 위치, 충돌 여부 판정 등을 계산하는 경우에는 실시간성이 크게 중요하며, 이러한 서버를 Tick 기반 서버라 부릅니다.
오늘은 개발 생산성과 인력 수급, 안정성 등에서 다루기 어렵다고 여겨지는 C++ 이 Tick 기반 서버 구현에 계속 사용되고 있는 이유에 대해 이야기해 보겠습니다.
편의상, 앞으로 Tick 기반 게임 서버를 게임 서버라 부르겠습니다.
게임 서버의 요구사항
게임 서버 구현에 C++이 왜 사용되는지 이야기하기 전에, 우선 게임 서버가 어떤 요구사항을 가지고 있는지 알아볼 필요가 있습니다.
C++이 게임 서버 구현에 사용되는 이유는, 결국 이러한 요구사항을 가장 잘 충족하는 언어이기 때문입니다.
1) 처리량 - 같은 시간에 얼마나 많은 일을 처리(Throughput)하는가?
MMORPG 같은 경우 일반적으로 10~30Hz의 Tick Rate를 가지며(1초에 10틱) 플레이어 위치, 충돌 판정, 상태 체크, 데미지 계산 등 한 번에 많은 요소를 계산해야 하므로 틱당 요구 처리량이 많습니다. 그리고 몇백 명 단위의 멀티플레이어가 존재하는 경우에는 그 배수만큼의 처리량이 요구되기에, 매우 높은 처리량이 필요한 경우가 많습니다.
2) 안정성 - 일을 처리하고, 사용자에게 응답하기까지 걸리는 시간(Latency)이 얼마나 일정한가?
MMORPG는 모든 유저가 같은 세계를 같은 시점에 보여줘야 하는 특성이 있습니다.
만약 유저 A와 B가 결투 중인데 A 화면에서는 B의 공격을 피한것으로 보이는데, B 화면에서는 A가 피하지 않았고, 서버에서 A가 죽은 것으로 처리될 경우 A 유저의 사용자 경험에 악영향을 주게 됩니다. (보통 유저들이 "렉 걸렸다"라고 말하는 경우)
게임 서버와 각 사용자들의 클라이언트는 각기 다른 물리적 거리만큼 떨어져 있기에, 서버로부터 응답을 받는 시간은 각 클라이언트별로 다를 수밖에 없습니다.
그러나 클라이언트별 응답시간이 일정하게 유지된다면, 클라이언트측이 보간(interpolation) 작업을 통해 사용자들에게 일관된 세계를 보여주기가 더욱 쉬워집니다.
C++의 특징
그렇다면 위에서 이야기한 게임 서버의 요구사항을 C++의 어떤 특성이 충족하는 걸까요?
1) GC(Garbage Collection)로 인한 성능 저하 없음
Java, C#은 메모리 할당과 해제를 자동으로 처리하기 위해 GC를 사용합니다.
문제는 GC가 동작할때마다 애플리케이션의 모든 스레드의 동작이 중지되는데 이를 STW(Stop-the-world)라 부릅니다.
불규칙하게 실행되는 GC에 의한 STW는 Jitter(응답시간의 불규칙한 정도)를 높게 만들어, 사용자들의 사용성을 해치는 결과를 야기합니다.
C++은 GC가 없기에 이러한 단점에서 자유로울 수 있습니다.
2) 네이티브 기계어 컴파일
C++은 Java, C#과 다르게 인터프리터를 거치지 않고 바로 기계어로 번역되어 CPU에서 실행됩니다. 이러한 기계어 번역 과정이 생략된 만큼 더 빠른 속도를 보장합니다.
그리고 Java, C# 등은 JIT을 사용하는데, JIT은 서버 재시작 후 자주 호출되는 코드들의 최적화가 점진적으로 이루어져 일정시간 동안은 처리속도가 느린 단점이 있습니다.
일반적으로 C++은 Java, C# 대비 2~5배 빠르다는 벤치마크 결과가 있습니다.
3) 레거시와 생태계
과거부터 MMORPG를 개발한 게임회사들은 C++로 게임 서버를 개발해왔으며, 20년이 넘는 긴 세월이 흘렀습니다.
그 기간동안 C++ 생태계에 수많은 게임 관련 라이브러리가 개발되었고, 전문 개발자들이 생겨났습니다.
그리고 각 게임사에는 많은 버그 해결과 고민이 누적된 수십~수백만 줄의 검증된 C++ 코드 베이스가 존재하게 되었습니다.
빠르게 게임을 개발할 수 있는 검증된 코드 자산과 숙련된 게임 개발자 인력풀을 활용하기 위해 여전히 많은 기업들은 게임 서버 개발에 C++을 사용합니다.
정리하면, C++은 높은 처리량과 안정성이 필요한 게임 서버 구현에 가장 어울리는 언어이며, 그를 기반으로 오랜 기간 쌓인 생태계 자산이 이를 더욱 뒷받침하고 있습니다.
물론 실시간성이 약한 장르라면 Java나 C#이 더 합리적인 경우도 있습니다. 결국 언어 선택은 게임의 특성에 달려 있습니다.