시리즈: 격투 게임이 지연 기반 넷코드 및 롤백 넷코드를 사용하는 방법에 대한 설명

 

원문

롤백 넷코드의 기술적 측면

이전 포스트에서 롤백이 작동하는 방식과 왜 롤백이 나쁜 연결 상태을 감추기에 좋은 이유에 대해 이야기했습니다. 그러나 이제 우리는 롤백 넷코드가 어떻게 만들어지는지, 롤백을 구현하는 게임이 무엇을 할 수 있어야 하는지, 왜 일부 게임에서 좋은 롤백을 만드는 데 어려움이 있는지에 대해 이야기해야 합니다.

좋은 넷코드를 만드는 것이 간단하기를 바라는 격투 게임 팬들의 바람과 달리 롤백을 구현하려면 많은 노력이 필요하며 고품질의 온라인 플레이가 우선이라는 개발 스튜디오의 강한 신념이 필요합니다.

 

 

다음은 롤백 vs 지연 기반 넷코드를 지원할 때 고유하게 처리해야 하는 목록입니다.

– 프레젠테이션 레이어로부터 격리된 게임 플레이
– 직렬화 가능한 게임 상태
– 입자 시뮬레이션
– 객체(object) 수명
– 사운드 FX
– 애니메이션 시스템
– UI
– 비동기 감지

 

게임을 개발하는 방법

롤백이 작동하는 방식에 대한 간단히 요약하면, 원격 입력을 알 수 없는 경우 게임은 예측된 입력을 바탕으로 어쨌든 해당 시점 이후 방향으로 시뮬레이션합니다. 실제 입력이 수신될 때 이러한 예측이 잘못된 경우 게임은 이전 게임 상태를 로드하고 게임 내 여러 논리 프레임을 재시뮬레이션하여 롤백해야 합니다.

따라서 롤백 게임의 주요 요구 사항은 다른 게임 상태를 저장 및 로드하고 백그라운드에서 게임 논리를 시뮬레이션할 수 있어야 하며, 이 모든 작업을 매우 빠르게 수행할 수 있어야 합니다. 이 간단해 보이는 설명만으로도 풀어야 할 내용이 이미 산더미처럼 쌓여있습니다.

컴퓨터 메모리에 있는 오브젝트를 저장 및 로드할 수 있는 형식으로 변환하는 작업을 직렬화(serialization)라고 하며, 나중에 롤백해야 할 경우를 대비하여 모든 단일 프레임의 게임 상태를 직렬화하고 저장해야 합니다. 이는 데이터에 따라 시간 소모적인 작업이 될 수 있는 게임 상태 직렬화가 전광석화처럼 매우 빠르고 잘 최적화되어야 함을 의미합니다. 게임이 빌드된 방식에 따라 데이터가 저장되는 방식과 게임의 다양한 시스템에서 필요한 성능을 얻기 위해 데이터 사용 방식을 변경해야 할 수도 있습니다. 처음부터 롤백을 염두에 두고 게임을 빌드하면 부담을 줄일 수 있지만 기존 게임에 롤백을 추가하면 게임의 핵심에 시스템 전체에 많은 변경 사항이 발생할 수 있습니다. NetherRealm Studios의 엔지니어인 Michael Stallone은 그의 팀이 Mortal Kombat X를 롤백 넷코드로 게임을 개조할 당시 직렬화 시스템을 구축하고 최적화하는 데 2년이 걸렸다고 추정하고 있습니다.

게임에서 수많은 프레임을 롤백해야 하는 경우 이전 상태가 역직렬화(deserialization)되고 로드되면 게임은 이 모든 프레임을 현재로 다시 시뮬레이션해야 하며(그리고 모든 프레임을 직렬화해야 합니다!) 백그라운드에서 신속하게 수행할 수 있습니다. 즉, 게임 로직은 게임 플레이 루프 내의 다른 모든 것들로부터 독립되어 있어야 합니다. 화면에 렌더링하는 시스템, 네트워크 대기 시스템 혹은 일반적으로 모든 프레임을 정상적으로 동작하게 하는 다른 시스템을 사용하지 않고도 많은 논리 프레임을 실행할 수 있어야 합니다. 선택한 엔진이나 엔진에서 제공하는 게임 루프 시스템을 얼마나 커스터마이즈했는가에 따라 이들 서브시스템을 분리 및 끄는 것이 매우 어려울 수 있습니다.

이 모든 것은 하나의 게임 프레임에서 수행되어야 하기 때문에 일반적인 게임 루프 조작과 더불어 일반적으로 최적화가 또 다른 주요 관심사입니다. 고급 파티클 시스템이나 패브릭 시뮬레이션에서 사용하는 고가의 CPU 사이클로 인해 게임의 성능 범위가 초과될 수 있습니다. 어쩌면 초기에 게임을 빌드할 때에는 극효율적이어야 할 필요성이 없었기 때문에 콘솔의 성능에 대해 대수롭지 않게 여겼을 수도 있습니다. Stallone에 따르면 기존 지연 기반 넷코드 솔루션에서  PS4 및 Xbox One의 추가 마력으로 인해 전체 프레임을 실행하는 데 16ms 예산 중 평균 10ms만 사용했다고 말합니다. 이후 최적화되지 않은 나이브한 롤백 솔루션으로 갓 전환했을 때에는 프레임 실행 비용이 32ms로 3배 이상 증가했고, 이로 인해 팀은 게임 내 시스템을 거의 모두 재평가하여 성능 향상을 모색해야 했다고 그는 말합니다.

 

NetherRealm Studios가 롤백을 사용할 수 있을 만큼 충분히 빠르게 MKX를 실행하기 위해 최적화하는 데 필요한 부분의 일부 목록입니다. 매우 복잡한 말 투성이입니다. (출처)

 

결정론적(deterministtic) 게임은 게임 상태를 저장 및 로드할 수 있고 게임 루프 내에서 충분히 빠르게 여러 프레임의 게임 로직을 실행할 수 있는 한 롤백 넷코드를 사용할 수 있습니다. 롤백에 대한 일반적인 통념과 달리 적용할 수 있는 게임 장르에 따른 제한은 없습니다. 롤백은 Street Fighter III 3rd Strike: Online Edition, Killer Instinct, Brawlhalla 및 For Honor를 비롯한 2D 또는 3D 격투 게임에 똑같이 사용될 수 있습니다(그리고 사용되어 왔습니다). 격투 게임 장르 외에서도 사용됩니다. Iron Galaxy는 4인 액션 게임 Dungeons & Dragons: Chronicles of Mystara에 롤백 넷코드를 통합했습니다. Rocket League와 같은 게임도 롤백을 통합하여 온라인 플레이를 오프라인 플레이만큼 반응형으로 만듭니다.

 

 

모든 플레이어의 싱크를 지속적으로 유지해야 함 (Keeping the world in sync)

입력 지연 또는 롤백에 의해 구동되는 모든 넷코드 솔루션은 두 시스템이 완전히 동기화된 상태로 실행되도록 유지해야 합니다. 이는 두 시스템이 각 플레이어에게 동시에 동일한 프레임을 표시하거나 가능한 한 이에 가깝게 표시한다는 것을 의미합니다. 대부분의 격투 게임은 프레임 속도를 60fps로 고정하려고 하지만 단순히 경기 시작 시 동기화하고 플레이어가 전체 전투 동안 동기화 상태를 유지한다고 가정하는 것만으로는 충분하지 않습니다. 콘솔 과열, 컴퓨터가 운영 체제 기능을 수행하거나 일시적으로 CPU에 과부하가 걸리는 것과 같은 네트워킹 외부의 많은 문제로 인해 성능이 저하되어 상대방과 동기화되지 않을 수 있습니다.

이 동기화를 수정하지 않은 결과는 치명적입니다. 플레이어 A는 프레임 20으로 표시되지만 플레이어 B는 프레임 23으로 표시되는 롤백 시스템을 생각해 보십시오. 네트워크 지연은 3개 프레임입니다. 플레이어 B는 프레임 23에 대한 입력을 플레이어 A에게 보냅니다. 플레이어 A는 프레임 20에 있기 때문에 네트워크 지연은 자신의 프레임 23에서 해당 입력을 수신하게 됨을 의미합니다. 프레임 23은 실행에 적시에 이루어지며 롤백할 필요가 없습니다. 한편, 플레이어 A는 프레임 20에 대한 입력을 플레이어 B에게 보냅니다. 네트워크 지연(3개 프레임)으로 플레이어 B는 자신의 프레임 26(플레이어 B의 프레임 23 + 3 프레임)에서 이 입력을 수신하게 되어 매우 불편한 6프레임 롤백이 반복적으로 발생합니다.

 

운이 나쁜 플레이어의 경우 극단적으로 일방적인 롤백이 어떻게 보일 수 있는지에 대한 예입니다. 다른 쪽은 동일한 경기의 훨씬 더 일반적인 버전을 봅니다. 이러한 조건에서 플레이하는 것은 불가능합니다.

 

이 롤백은 완전히 일방적입니다. 다른 플레이어보다 앞서가는 플레이어만 나쁜 연결의 영향을 경험할 것입니다. GGPO의 발명한 여러 방면으로 현대 롤백의 창시자인 Tony Cannon은 이것이 Street Fighter V의 롤백 시스템의 결함 중 하나이며 적절한 클록 동기화가 SFV의 열악한 온라인 플레이를 해결하는 데 큰 도움이 될 수 있다고 이론화했습니다. 일부 팬은 자체 테스트를 실행하여 유사한 결론에 도달했습니다. 요점을 더 잘 설명하기 위해 Zinac은 롤백의 이점에 대해 가르치도록 설계된 매우 간단한 프로젝트를 사용하여 작동 중인 일방적 롤백 효과를 보여줍니다.

 

Zinac의 네트워킹 예제에는 빨간색을 제어하는 P1과 파란색을 제어하는 P2가 있습니다. 그는 P2의 게임이 P1보다 몇 프레임 앞서 있어 재동기화할 방법이 없도록 만들었습니다. 파란색이 움직이면 싱크에서 뒤에 있는 P1은 파란색 상자가 부드럽게 움직이는 것을 본다. 그러나 빨간색이 움직일 때 동기화에서 앞서 있는 P2는 엄청난 롤백을 봅니다. (출처)

 

문제 해결은 비교적 간단합니다. 대부분의 롤백 시스템은 앞서 있는 플레이어를 1~2프레임 동안 일시 중지하여 뒤처진 플레이어가 따라잡을 수 있도록 합니다. 게임이 이 시스템의 가장 위에 있고 게임이 매우 멀리 떨어져 있지 않도록 하면 수정은 빠르고 고통 없이 이루어집니다. 이러한 일시 중지는 입력 누락이나 기타 네트워킹 문제로 인한 것이 아닙니다. 것은 컴퓨터마다 약간 다른 속도로 소프트웨어를 실행하는 것을 예측할 수 없는 방법으로 수정하도록 설계되어 있고 동기화를 유지하기 위해 10초마다 1프레임씩 손실시키는 것은 아무리 예민한 플레이어라도 알아차릴 수 없습니다.

 

GGPO란 무엇인가?

격투 게임 커뮤니티에서 시간을 보낸다면 EVO 공동 설립자 Tony Cannon이 작성한 롤백 라이브러리(현재는 무료이며 오픈 소스입니다!)인 GGPO에 대해 들어보셨을 것입니다. 격투 게임 팬들 사이에서 “GGPO”와 “롤백”이 같은 의미로 사용되는 것을 자주 듣게 될 것입니다. 2006년 말 GGPO의 첫 번째 릴리스는 에뮬레이터에서 실행되는 인기 있는 레거시 격투 게임으로 롤백의 개념을 테스트하도록 설계되었으며 얼마 지나지 않아 Cannon은 라이선스를 부여하고 최신 게임에 통합할 수 있는 라이브러리 버전을 출시했습니다.

GGPO의 주요 기능은 기기와 게임 상태를 동기화하기 위한 강력한 솔루션을 제공하는 것입니다. 예를 들어 GGPO는 두 대의 컴퓨터가 동기화되지 않은 경우와 그 정도를 게임에 알릴 수 있습니다. 또한 연결된 모든 당사자의 입력을 추적하고 롤백 시기, 양, 롤백 중에 적용할 새로운 입력을 게임에 알려줄 수 있습니다.

GGPO는 롤백 프레임워크의 이러한 부분을 처리하는 솔루션으로 잘 테스트되고 입증되었기 때문에 롤백 넷코드를 사용하려는 게임을 만드는 데 탁월한 자산입니다. 그러나 실제로 롤백을 수행하는 행위는 여전히 개발자에게 있습니다. 그들은 게임의 성능, 게임 로직이 게임 루프의 다른 부분과 적절하게 분리되어 있는지, 모든 경계 조건(edge case)가 지능적으로 처리되는지 확인해야 합니다. GGPO는 롤백 시기와 이유, 게임을 시뮬레이션해야 하는 새로운 입력을 알려줍니다. 게임이 이러한 목표를 달성하는 방법에 대한 특정 구현과 관련이 없으므로 유연한 도구이지만 롤백이 작동하는 데 필요한 완전한 기능 제품군은 아닙니다. 또한 Killer Instinct를 포함한 일부 게임은 게임 상태를 추적하고 클라이언트를 동기화하기 위한 자체 사내 솔루션을 코딩하여 GGPO 라이브러리를 직접 사용하지 않고 롤백 넷코드를 구현합니다.

GGPO가 롤백을 처리하고 게임과 통신하는 정확한 방법에 더 관심이 있다면 Tony Cannon이 작성한 Game Developer Magazine의 기사를 읽는 것이 좋습니다. 좀 더 기술적 초점에 맞춰저 있지만 프로그래머이거나 GGPO가 게임에 제공하는 정확한 기능에 대해 궁금한 점이 있으면 관심을 가질 수 있습니다. 또한 소스 코드를 정독하고 롤백 이론에 대한 Tony의 설명을 읽을 수도 있습니다.

 

경계 조건(edge cases)에 주의

오브젝트를 만들고 파괴하는 것이 더 어려워집니다. 로컬 플레이어가 장풍을 던지고 상대방이 장풍 앞에서 다운백(down-back)한 뒤 막을 준비를 했다고 가정해 보겠습니다. 롤백은 예측된 입력을 사용하여 로컬 플레이어의 화면에서 이 장풍을 차단하는 상대를 보여줍니다. 장풍이 막히면 파괴되며, 장풍 주변에 파티클(particle; 입자) 효과가 나타납니다. 그러나 원격 입력이 들어온 것을 보니 상대방은 장풍이 막히기 직전에 무적의 움직임(invincible move)을 한 것으로 나타났습니다. 이는 실제로 파괴되지 않았으며 화면에서 계속 이동해야 함을 의미합니다. 많은 게임에서 장풍이 파괴된 후 다시 생성하는 것은 수고가 많이 들고 이상한 시각적 팝핑으로 이어질 수 있습니다. 많은 롤백 게임이 사용하는 솔루션은 많은 롤백에서 파괴를 취소해야 하는 경우에 대비하여 파괴될 많은 프레임 동안 오브젝트를 저장하는 것입니다. 이 경우 게임 로직에 약간의 변경이 필요할 수 있습니다. 파티클 시스템은 또한 많은 특별한 주의가 필요합니다.

오디오는 롤백 게임에서도 특히 어려운 문제입니다. 예측 버전에서 재생된 사운드는 롤백 버전에서 짧게 잘라 중지해야 하는 경우가 많으며, 로컬 버전에서 재생되지 않은 사운드는 롤백이 게임 상태를 바꿀 때 몇 밀리초 안에 재생해야 합니다. 이것은 게임 로직이 게임 루프의 다른 모든 측면과 분리되어야 한다는 것을 기억할 때 특히 문제가 됩니다. Street Fighter x Tekken과 같은 현대 게임 롤백의 초기 버전에서는 한 번에 몇 초 동안 소리가 끊기거나 재생된 소리가 급격히 튀거나 동기화되지 않는 끔찍한 사운드 버그가 있었습니다. Tony Cannon은 Game Developer Magazine 기사에서 롤백 엔진에서 오디오를 처리하는 방법, 특히 “게임 상태와 렌더링의 분리” 섹션에서 몇 가지 조언을 제공합니다.

 

 

또한 절대 롤백하고 싶지 않을 때도 있을 수 있습니다. Stallone은 MKX에서의 잔혹행위나 Injustice 2에서의 스테이지 전환과 같은 급격한 카메라 전환 이벤트에서는 롤백이 매우 바람직하지 않다고 언급하고 있습니다.이것은 로컬 플레이어가 이벤트가 발생했다는 100% 긍정적이고 롤백할 수 없을 때까지 롤백이 실행되지 않도록 해야 한다는 것을 의미합니다. 이로 인해 모든 게임 플레이 시스템 팀에서 엔지니어링 및 디버깅 작업으로 이어지며 비용이 추가됩니다.

또한 예측 알고리즘 중에 마지막으로 알려진 프레임을 올바르게 복사하도록 주의해야 합니다. 여기에는 원격 플레이어의 방향과 원격 플레이어가 누르고 있는 버튼(또는 누르고 있지 않은 버튼)이 포함됩니다. 이 예측을 망치면 원겨 플레이어로 하여금 실제로 실행하지 않은 것을 하게 할 수 있습니다. 이거이 롤백되었을 때, 매우 혼란스러울 것입니다.

 

원격 플레이어의 Cody(남자 캐릭터)는 EX Zonk Nuckle을 실행합니다.이 동작은 버튼을 눌렀다 놨다 하는 것으로, 그 후에 어떻게든 롤백됩니다. 이러한 현상이 발생하는 가장 좋은 이유는 SFV가 예측 단계에서 Cody가 어떤 버튼을 누르고 있었는지 정확하게 기억하지 못했기 때문에 버튼 해제 이동을 하게 된 것입니다. (출처)

 

롤백은 노력을 들일 가치가 있는가?

게임에 롤백을 추가하는 데 노력과 비용이 든다는 것은 부인할 수 없지만, 저는 이 섹션에서 롤백을 구현하는 것이 너무 어려워서 실현이 불가능하다고 생각하지 않았으면 합니다. 현실은 “GGPO를 오후에 게임에 복사-붙여넣기”와 “전체 예산을 롤백 시스템에 투자” 사이의 중간쯤에 있습니다.

롤백을 구현하기로 결정한 시점에 따라 크게 달라집니다. 게임 플레이 시스템이 구축된 후 게임에 롤백을 추가하는 것은 종종 매우 어려운 일입니다. NetherRealm Studios가 이미 출시된 게임인 Mortal Kombat X에 롤백 넷코드를 패치하기로 결정했을 때 많은 프로그래머가 10개월에 걸쳐 약 8M/Y(*Man per Year; 한 사람이 100%의 노력을 했을 때 작업 완료까지 걸리는 시간 수)의 시간을 투입하였습니다. 아주 작은 스튜디오 Rivals of Aether는 완성된 게임을 지연 기반에서 롤백으로 변환하는 방법을 탐구하는 데 몇 년에 걸쳐 많은 개발 시간을 보냈지만 결국 비용이 너무 많이 드는 것으로 판명되자 계속 원래대로 진행해야 했습니다. 한편, Skullgirls의 수석 프로그래머 Mike Zaimont는 롤백을 위해 잘 계획된 커스텀 엔진을 사용하여 개발 초기 약 2주 만에 게임에 GGPO를 추가했습니다. 따라서 개발 초기에 롤백을 우선 순위로 결정하면 필요한 투자 금액을 크게 줄일 수 있습니다.

롤백을 구현하면 게임의 다른 영역에서도 몇 가지 이점을 얻을 수 있습니다. 예를 들어, 게임에 게임 상태를 저장하고 로드하는 강력한 방법이 있는 경우 이를 사용하여 플레이어에게 더 나은 훈련 모드 옵션을 제공할 수 있습니다. 롤백을 한 번 구현하면 향후 게임에서 지식을 활용할 수 있습니다. MKX에 롤백 넷코드의 도입을 위해 열심히 노력한 결과, NetherRealm과 그 팬들은 이제 Injustice 2 및 Mortal Kombat 11을 포함하여 동일한 엔진을 개조하여 구축된 모든 향후 타이틀에서 원활한 네트워크 플레이를 즐길 수 있게 되었습니다.

그러나 현실에서 롤백 넷코드는 이전 방법보다 더 많은 작업을 필요로 하는 최초의 가치 있는 기술 진보와는 거리가 멉니다. 역운동학(inverse kinematics)과 같은 애니메이션 기술은 많은 스튜디오가 효과적으로 구현하기 위해 더 비싼 초기 투자임에도 불구하고 이제 많은 게임에서 표준이 되었으며, 수년간 문제에 대해 작업한 후 개발자는 이제 더 나은 개발 도구를 갖출 수 있게 되었습니다. 롤백의 가치는 거기에 있으며 개발자는 게임에서 그 이점을 우선시하는 것을 경계해서는 안 됩니다. 결국, 전 세계 커뮤니티를 연결할 수 있는 매끄럽고 안정적이며 일관된 온라인 플레이보다 현대 격투 게임에 더 중요한 것이 있습니까?

 

 


(계속)


시리즈: 격투 게임이 지연 기반 넷코드 및 롤백 넷코드를 사용하는 방법에 대한 설명

 

원문

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: etc.


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다