2XKO가 온라인 플레이를 대하는 방식
안녕하세요, 여러분! 2XKO의 선임 수석 소프트웨어 엔지니어인 토니 캐논입니다. 이번 시간에는 무대 뒤편을 둘러보며, 플레이어 여러분에게 최고의 온라인 플레이 경험을 제공하기 위해 저희가 어떤 노력을 하고 있는지를 소개하고자 합니다.
기술적인 내용이 많이 나올 예정이니, 급하신 분은 아래의 요약을 참고하세요.
- 저희는 최대한 안전하고 끊김 없는 온라인 플레이 환경을 위해 노력하고 있습니다. 이를 위해 클라이언트-서버 아키텍처, 롤백 넷코드, 소위 ‘공정한 플레이’ 모드라 부르는 기술 등 다양한 시스템을 사용하고 있죠.
- 저희는 부정행위 방지에 진심입니다. 스크립트가 아닌 실제 인간을 상대로 게임을 플레이할 수 있도록 라이엇 뱅가드를 사용하고 있습니다.
-
저희는 게임 외 시스템이 작동하도록 다양한 신기술을 사용 중입니다.
- 게임 확인 서버라는 기능을 통해 클라우드에서 각 게임을 똑같이 실행하여, 이를 부정행위 방지, 실력대 확인, 관전 등의 시스템에 활용하고 있습니다.
- 이제 대전을 검색하면 다른 로비에서도 상대를 찾아, 현재 속한 로비에 사람이 없을 때도 빠르게 게임을 시작할 수 있습니다.
좋습니다. 그럼 시작해 보죠.
온라인 플레이를 최우선으로
2XKO는 개발 초기부터 온라인 플레이에 많은 공을 들였습니다. 핵심 기술을 구축하면서 가장 중요하게 여긴 것이 바로 클라이언트에 GGPO를 내장하고, 모든 플레이테스트를 온라인으로 진행하는 것이었죠. 당시에는 온라인 플레이가 컴퓨터 간 직접 통신으로 이뤄졌지만, 그런 상태에서도 라이엇 게임즈의 라스베이거스 데이터 센터에 패킷 프록시 서버를 구축하고 운영하며 매일 이뤄지는 플레이테스트가 실제 인터넷 환경에서 이뤄지게 했습니다. 이는 기획 단계에서부터 기반을 세우는 것이 중요하다고 생각했기 때문입니다. 심지어는 모든 챔피언의 기술, 이지선다, 애니메이션, 시각 효과까지 모든 요소를 온라인 플레이에 우선적으로 맞춰 제작하고 테스트하며 오프라인 환경과의 차이를 없애려 했죠.
클라이언트-서버 아키텍처
온라인 플레이 구조는 개발이 진행됨에 따라 컴퓨터 간 직접 통신에서 클라이언트-서버 아키텍처 방식으로 바뀌었습니다. 4명의 플레이어가 대전에 참여할 수 있어야 했고, 더 안정적인 성능과 확장성이 필요했기 때문이죠. 이러한 변경 덕에 4명이 게임에 참가했을 때 각 플레이어가 클라이언트 서버와 주고받는 트래픽의 양이 직접 통신 방식에 비해 3분의 1 수준으로 감소하였습니다. 필요한 대역폭과 패킷 손실의 발생률도 줄어들고, 네트워크 연결이 불안정한 상황에서도 원활한 플레이가 가능하게 되었죠. 물론 클라이언트-서버 아키텍처를 도입한 데는 다른 이유도 있습니다.
개인정보 및 IP 보호
클라이언트-서버 아키텍처를 채택한 가장 큰 이유는 다른 플레이어에게 IP 주소가 노출되는 일을 막기 위해서였습니다. IP 노출은 직접 통신 방식이 갖는 최대의 문제점이기도 하죠. 다른 플레이어와 게임을 플레이하는 순간, 상대에게 패킷으로 네트워크를 마비시킬 빌미를 주는 겁니다. 그러면 게임을 강제로 종료하고 패배를 받아들일 수밖에 없죠. 심한 경우에는 거주지가 외부에 노출될 수도 있습니다. 저희는 보안을 매우 중요하게 생각하기 때문에, 플레이어 여러분의 IP를 보호하기 위한 가장 효과적인 방법으로서 클라이언트-서버 아키텍처를 선택했습니다.
시간과 입력의 기준
서버는 2XKO의 시스템에서 또 다른 매우 중요한 역할을 맡고 있습니다. 바로 입력, 상태, 시간의 기준이 되는 것이죠. 개발하는 입장에서 보면, 롤백 기능 구현은 첫걸음일 뿐입니다. 넷코드의 품질은 알고리즘이 '균열'의 균형을 얼마나 잘 맞추는지에 따라 정해진다고 봐도 과언이 아니죠. 균형을 맞춘다는 건 플레이어에게 롤백의 부담을 나눠서 지운다는 말입니다. 만약 한쪽에서 3프레임의 롤백이 발생한다면, 다른 한쪽도 동일한 롤백이 발생해야 하죠. 하지만 누구는 5프레임의 롤백을 겪고 있는데 누구는 1프레임만 롤백되면 균열의 균형이 어긋난 겁니다.

너무 복잡하지 않게 설명하자면, 균열의 균형을 맞춘다는 건 모든 플레이어의 게임 내 시계를 동기화시킨다는 뜻입니다. 이건 직접 통신 방식을 사용하는 2인용 게임에서도 까다로운 일이죠. 양쪽 플레이어가 동일한 정보에 따라 움직이게 하려면 어떻게 해야 할까요? (전문가 TMI: 여담이지만 이건 사실 두 장군 문제와 관련이 있습니다. 해결하는 건 아마 불가능하겠죠.) 4인용 게임에서는 그야말로 머리 깨지는 상황이 될 겁니다!
이 때문에 서버가 시간의 기준이 되어 줄 필요가 있는 겁니다. 게임에 참여 중인 모든 플레이어의 시계를 추적하는 핵심 기준점이 있다면, 균열의 균형을 더 원활하게 바로잡을 수 있겠죠.
공정한 플레이 모드
공정한 플레이 모드는 2XKO의 온라인 플레이 경험을 개선하기 위해 준비 중인 또 다른 기능입니다. Wi-Fi, 휴대폰 테더링, 최소 사양에 조금 못 미치는 컴퓨터를 사용하는 플레이어와의 대전은 모두가 겪어 봤을 일이죠. 이러면 어떤 현상이 일어날까요? 게임이 멈추거나 버벅거리겠죠. 심한 경우에는 극단적인 롤백이 발생해 캐릭터들이 사방으로 순간이동을 하기도 합니다. 직접 통신 방식에서는 사실 이게 그나마 최선입니다. 각 플레이어의 입력을 제시간에 받지 못하면 롤백 기능으로도 구원이 불가능하니까요. 부정행위자가 있다면 이는 더 큰 문제를 낳습니다. 악의적인 플레이어라면 컨트롤러에 끊김 유발 기능을 추가해 의도적으로 패킷 손실을 유발할 수도 있고, PC의 앱 제목 표시줄을 건드려 프로그램을 정지시킬 수도 있죠. 두 방법 모두 일시적으로 게임의 속도를 크게 늦춰, 연계를 끊어 버리기에는 충분합니다.
하지만 공정한 플레이 모드가 활성화되면, 2XKO의 게임 서버가 각 플레이어의 입력에 짧은 유예 시간을 적용합니다. 새 입력이 늦게 도착하는 경우에는 직전에 입력한 내용을 똑같이 실행하고 게임을 계속 진행하죠. 이 방식은 큰 변화를 불러옵니다. 상대가 네트워크를 어떻게 손대든 간에, 게임플레이 경험에는 영향이 가지 않게 되죠. 일부러 끊김을 유발하거나 Wi-Fi가 꺼지는 경우에도 알아차리지 못하실 겁니다. 물론 이 기능은 양날의 검과 같습니다. 본인의 네트워크 연결 상태에 단 몇 초 동안만 이상이 발생하는 경우에도 상대 팀에게 기나긴 연계를 얻어맞게 될 가능성이 있죠.
현재로서는 실험 단계에 있는 모드인 만큼, 제대로 작동하게 하려면 오랜 개발이 필요할 겁니다. 정상적인 플레이어에게 문제를 일으키지 않으면서도, 패킷 손실로 이득을 보려 하는 부정행위자를 처벌할 수 있도록 노력하겠습니다. 기능이 완전히 도입되면 공지할 테니 이용 소감이 어떤지 피드백을 보내 주세요.
글로벌 기반 시설 및 보안
물론 이 모든 네트워크 기능은 강력한 글로벌 백본이 없다면 구축할 수 없었을 겁니다. 저희는 라이엇 게임즈의 네트워크 기반 시설을 온전히 사용해 이를 구현하고 있습니다. 2XKO의 네트워크 트래픽은 라이엇 다이렉트 백본을 경유해 전송됩니다. 플레이어의 패킷을 인터넷 지연 시간보다도 빠른 속도로 서버에 보내는 것이죠. 또한 이 서버는 일반화된 DDoS 서비스로 보호받기 때문에, 부정행위자 때문에 플레이어 여러분이 비공개 로비에서 개최한 대회의 최종 결승이 중단될 가능성은 없다고 보셔도 좋습니다. 저희는 라이엇 게임즈의 게임 프로비저닝 플랫폼을 사용해 전 세계의 서버를 관리하며, 출시된 지역의 모든 플레이어가 낮은 핑으로 대전을 즐길 수 있도록 노력하고 있습니다. 장기적으로는 전 세계의 거의 모든 플레이어 거주지 근처에 서버를 두는 것이 목표지만, 이건 시간이 조금 더 걸릴 수 있습니다. 그동안은 인내심을 가져 주시길 바랍니다.
라이엇 뱅가드 부정행위 방지 시스템
온라인 환경에서 정정당당한 경쟁이 이뤄지려면 공정성도 필요하므로, 저희는 네트워크 기능만큼 강력한 부정행위 방지 수단을 사용하고 있습니다. 2XKO에서는 뱅가드를 활용해 스크립트와 봇 사용을 방지할 것입니다. 뱅가드는 리그 오브 레전드의 봇 사용률을 99% 넘게 떨어뜨리며 이미 그 우수한 성능을 입증한 바 있죠. 이를 통해 자동 패리 및 빈틈 반격 스크립트 같은 부정행위를 벌이지 않는 실제 인간과 게임을 플레이할 수 있게 할 것입니다. 하지만, 경쟁의 공정성을 유지하는 건 단번에 해결될 문제가 아니죠. 이건 지속적인 노력이 필요한 일입니다. 이 부분은 계속해서 예의주시하며 필요할 때마다 접근 방법을 조정하도록 하겠습니다.
고정된 입력 지연 및 프레임 조율
2XKO의 게임플레이 감각을 온라인/오프라인, PC/콘솔 구분 없이 일정하게 유지하기 위한 노력은 이뿐만이 아닙니다. 입력 지연과 프레임 조율 하위 시스템 역시 세밀히 조정하며 여기에 기여하고 있죠.
고정된 입력 지연
저희가 사용 중인 첫 번째 방법은 모든 입력에 3프레임의 고정된 지연 시간을 추가하는 겁니다. 이건 대부분의 격투 게임에서 롤백의 길이를 최소화하기 위해 흔히 사용하는 기법인데요. 2XKO에서는 온라인과 오프라인 플레이 모두에 이를 적용하고 있습니다. 다시 말해 오프라인 환경에서 연습할 때 익힌 연계의 타이밍이나 습관을 온라인 플레이에서도 그대로 활용할 수 있다는 것이죠. 이 3프레임이라는 시간은 이미 수년 전에 결정한 수치입니다. 기술이 빗나간 뒤 확정 반격을 입력하는 타이밍부터 게임에서 발동이 가장 빠른 기술까지, 모든 요소가 3프레임의 입력 지연을 전제로 제작되고 테스트된 겁니다. 그러니 지연 시간이 존재하더라도 쾌적하게 게임을 즐길 수 있겠죠.
프레임 조율
두 번째 방법은 프레임 조율에 많은 공을 들이는 것입니다. 프레임 조율이란 각 프레임을 일정한 속도로 시뮬레이션하고, 렌더링하며, 표시하는 기술입니다. 조율이 균일하지 않게 이뤄지면 화면이 끊어질 수도 있고, 1프레임 간격으로 성립하는 연계가 타이밍을 제대로 맞췄는데도 때때로 이어지지 않을 수도 있죠. 저희는 입력 지연과 콘솔과 PC 간 차이를 최소화하는 방향으로 프레임 조율 기능을 조정하였습니다. 덕분에 현재는 버튼을 눌렀을 때 화면에 결과가 표시되기까지 걸리는 시간이 PC, PS5, Xbox에서 거의 동일하죠. 이러한 노력 덕분에 2XKO는 오프라인이건 온라인이건, 집에서 PC로 플레이하건 대회장에서 콘솔로 플레이하건 똑같은 플레이 감각을 선사합니다.

게임 확인 서버 (GVS)
위에서 서버가 게임 상태의 기준이 된다고 했는데, 그게 정확히 무슨 뜻인지는 설명하지 않았죠. 이건 부정행위와 부계정 사용을 방지하기 위한 요소입니다. 2XKO에서는 대전이 펼쳐질 때마다 서버에서 똑같은 게임이 진행됩니다. 만약 2대2 대전 중이라면 클라우드상에서 5번째 게임이 실시간으로 돌아가는 게 되겠죠. 저희는 이를 ‘게임 확인 서버’(GVS)라고 부르고 있습니다.
이 시스템의 이점은 실로 엄청납니다. 일단 게임이 서버에서 돌아가는 만큼, 누군가가 화나서 프로그램을 꺼 버리거나 랜선을 뽑았을 때 제재를 적용할 대상을 확실하게 판별할 수 있죠. 하지만 GVS는 여기서 한 발짝 더 나아갑니다. 만약 누군가가 조작을 가해 게임의 상태를 변경했다면, 그 체크섬 값을 GVS의 것과 비교하여 해당 플레이어를 찾을 수도 있습니다. 이를 통해 일부러 게임 상태를 수정하여 무승부를 유도하는 부정행위를 방지하는 것이 가능하죠.
GVS는 다운스트림 데이터 파이프라인으로 대전의 결과를 전송하는 역할도 맡고 있습니다. 라이엇 게임즈의 중앙 랭크 서비스로 각 게임의 세부적인 통계를 보내는 것도 GVS의 기능 중 하나입니다. 랭크 서비스는 Microsoft의 True Skill 2 알고리즘을 통해 게임 종료 후의 여러 수치를 평가하여, 겨우 몇 판의 게임만으로도 플레이어의 실력대를 효과적으로 판단합니다. 이는 일방적인 대전으로 인해 고통받을 일이 크게 줄어든다는 뜻이기도 합니다. 부계정 사용도 효과적으로 적발해 낼 수 있을 것으로 봅니다.
로비 및 관전 기능
저희는 핵심 게임플레이를 뺀 게임 외 시스템에도 많은 공을 들였습니다. 그중에 가장 큰 비중을 차지하는 것이 바로 로비 기능인데요. 격투 게임은 집에서 친구 여럿과 함께 플레이하거나, 대회 또는 주간 모임에서 오프라인으로 다 같이 즐길 때 가장 재미있는 법이죠. 2XKO의 로비는 이러한 사회적 교류를 온라인에 구현하는 것이 목표입니다.
진행 중인 대전
제가 가장 좋아하는 기능은 진행 중인 게임을 바로 관전하는 겁니다. 다른 플레이어의 플레이를 구경할 수 있다는 건 오프라인 환경의 대표적인 장점이죠. 각 캐릭터의 새로운 활용법을 익힐 수도 있고, 다른 플레이어의 전략을 배울 수도 있습니다. 아니면 대회에서 자신을 탈락시킨 상대에 맞서 친구를 응원하는 것도 가능하고요. 저희는 이 놀라운 경험을 온라인에 그대로 되살리고 싶었습니다.
2XKO의 로비에서는 플레이어가 대전 중인 캐비닛에 접근하면 머리에 화면이 뜹니다. 그리고 몇 초만 지나면 진행 중인 대전을 그대로 볼 수 있죠. 챔피언을 선택 중이건, 게임을 막 시작했건, 한 번의 공격만으로 승자가 정해질 수 있는 마지막 라운드의 막바지건 간에, 긴 동기화나 재생 지연 시간 없이 플레이어들이 보고 있는 장면을 거의 실시간으로 관전할 수 있는 겁니다. 마치 처음부터 보고 있었던 것처럼 말이죠.
관전 중 서버의 역할
이 관전 시스템은 꽤 긴 실험 끝에 구현한 것입니다. 2XKO처럼 롤백 넷코드를 사용하는 격투 게임은 완전히 결정론적입니다. 따라서 입력 기록만 있다면 대전을 그대로 다시 볼 수 있죠. 만약 누군가가 캐비닛 뒤에 서서 1라운드부터 게임을 관전한다면, 그냥 입력 기록을 그대로 전송하기만 하면 됩니다. 하지만 이미 대전이 한창이라면 어떻게 해야 할까요? 가장 쉬운 방법은 각각의 관전자에게 모든 입력 기록을 전송하고, 현재 게임 상태를 따라잡을 때까지 고속 재생을 시키는 겁니다. 하지만 이러면 시간이 오래 걸리겠죠. 알파 랩 1 전의 초기 로비 시스템은 실제로 이 방식을 사용했습니다. 작동은 했지만, 쾌적하진 않았죠. 게임 상태를 따라잡을 때까지 5~20초를 기다려야 했기 때문에, 관전하려는 플레이어가 그리 많지 않았습니다.
하지만 GVS가 도입된 뒤부터는 더 효율적인 방법을 사용할 수 있게 되었습니다. 상술한 것처럼 GVS는 서버에서 실시간으로 게임 상태를 확인하는 시스템입니다. 이를 활용하면 플레이어가 도중부터 게임을 관전한다고 해도 입력 기록을 전부 보내지 않아도 되죠. 대신 GVS에 현재 게임의 스냅숏을 요청하고, 해당 시점부터의 입력 기록을 보내면 됩니다. 스냅숏이란 시스템의 결정론적인 부분만을 잘라서 보관하는 효율적인 저장 방법입니다. 용량도 50KB밖에 안 되니 플레이어에게 빠르게 전송할 수 있죠. 그러면 3분 동안 발생한 입력 기록을 빠르게 재생하는 것이 아니라, 50KB 크기의 스냅숏만 불러오면 즉시 게임 상태를 따라잡을 수 있는 겁니다. 참으로 마법 같은 방법이죠. 적어도 저한테는 그랬습니다.
서버 쪽에서 게임을 시뮬레이션하지 않았다면 결코 구현하지 못했을 기능입니다. 관전 기능을 시험적으로 제작했을 때는 게임의 첫 번째 플레이어로부터 스냅숏을 받아서 관전자에게 보냈습니다. 하지만 이는 다양한 문제를 낳았죠. 일단 스냅숏을 찍고 압축하는 것부터가 까다로웠습니다. 대전 중인 플레이어의 기기 성능이 낮은 경우에는 누가 관전을 시작할 때마다 FPS가 급격히 떨어지곤 했죠. 이건 정말 큰 문제였습니다. 누가 게임을 관전하는 것 때문에 기술이 맞았는지 막혔는지를 놓치는 상황이 상상되시나요? 그뿐만이 아니라 안전하지 않기도 했습니다. 이 방식은 부정행위자의 공격 경로가 될 가능성이 있었습니다. 전송되는 스냅숏을 조작해서 버퍼 오버플로 공격을 가하는 식으로 다른 플레이어의 기기에 악영향을 주는 일이 생길 수도 있었죠. 이 모든 단점은 모든 관전 데이터를 안전한 서버로부터 받는 것으로 해결할 수 있었습니다.
로비 간 대전 검색
마지막으로 다루고 싶은 건 로비 간 대전 검색 기능입니다. 2XKO의 로비에서는 다양한 방식으로 대전에 참여할 수 있죠. 개별 플레이어에게 직접 도전할 수도 있고, 캐비닛에 앉아 상대가 찾아오기를 기다릴 수도 있습니다. 아니면 옛날 오락실처럼 동전을 올려놓고 다음 순서를 맡아 놓거나, 대전 검색을 통해 자동으로 상대를 찾는 것도 가능하죠.
이 방식들은 로비가 가득 차 있을 때는 제대로 작동하지만, 몇 가지 예외 사례가 있습니다. 만약 로비의 모든 사람이 게임을 즐기고 있는 상황에서 혼자 대전을 검색하면 어떻게 될까요?
순위표, 연승 효과, 현장 관전 등의 짜릿한 요소는 알파 랩 1에도 있었지만, 이를 즐기려면 때때로 긴 시간을 들여 대전 상대를 찾아야 했습니다. 사실, 오로지 빠른 온라인 대전만을 원하는 플레이어라면 메인 메뉴에서 ‘대전 찾기’를 누르는 등의 방법으로 더욱 빠르게 대전에 참여할 수 있었습니다. 그 방법을 사용하면 현재 로비만이 아니라 접속 중인 모든 플레이어를 검색하기 때문이죠.
이에 클로즈 베타에서는 대전 검색 기능을 수정해, 현재 로비만이 아니라 모든 온라인 로비에서 대전 상대를 찾도록 했습니다. 만약 현재 로비에서 상대를 발견하면 캐비닛을 배정해 플레이어들이 그리로 이동하게 했죠. 다른 로비에서 상대를 발견한 경우에도 방식은 거의 같습니다. 각 플레이어가 속한 로비에서 캐비닛을 배정하고, 홀로그램 형태로 묘사된 상대가 옆자리에 앉는 연출을 보여 주는 식이죠. 대전이 종료된 다음에는 양쪽 플레이어가 원래의 로비로 돌아갑니다. 물론 이렇게 게임을 해도 연승 기록은 남으니 걱정하지 않으셔도 됩니다.
이 방법을 사용하면 지역 내의 모든 로비가 동일한 로비 간 대전 검색 시스템을 경유합니다. 따라서 로비에서 상대를 찾을 때도 메인 메뉴에서 로비를 통하지 않고 대전을 검색하는 것과 같은 시간이 걸리죠. 2XKO의 대전 검색 시스템은 정해진 시간 내에 최고의 대전 상대를 찾도록 조정되어 있습니다. 만약 많은 사람이 접속해 있는 황금 시간대라면 겨우 몇 초 만에 실력이 비슷한 플레이어를 만날 수 있죠. 사람이 많지 않은 새벽 3시라고 하더라도 상대를 거의 즉시 만날 수 있습니다. 황금 시간대에 비해 실력 차가 클 가능성이 높겠지만요. 한산한 시간대에 대전 검색이 느려지는 건 2XKO만의 문제가 아닙니다. 접속 중인 플레이어 수가 적다면 어느 온라인 게임에서건 발생하는 일이죠. 상대를 찾는 시간과 실력 차 중 어느 것을 우선시할 것인지는 조정이 가능한 부분이니, 느낌이 어떠셨는지 피드백을 주셨으면 합니다. 얼리 액세스 기간에 완벽히 해결할 수 있었으면 좋겠군요.
앞으로의 계획
글이 정말 길었는데 여기까지 읽어 주신 분께 감사의 말씀 드리고 싶습니다. 저희는 격투 게임을 즐길 때 온라인 플레이가 차선책이 되어서는 안 된다고 믿습니다. 확인용 서버, 즉시 관전하기 위한 롤백 기능 조정, 로비 간 대전 검색 등 지금까지 구현한 모든 기능은 전부 온라인으로도 오프라인 환경만큼 빠르고, 공정하며, 재미있는 경험을 선사하기 위한 것입니다. 그런 만큼 이번 얼리 액세스 이후로도 계속해서 기능을 조정하고 테스트하며 플레이어 여러분의 피드백에 귀를 기울이도록 하겠습니다. 계속해서 의견 전해 주시고, 버그 신고와 제안 사항도 보내 주셨으면 합니다.
읽어 주셔서 감사합니다.
토니 캐논 드림