[NDC2019] 조조전에 실시간 PvP? '경쟁전' 로직 개발기

게임뉴스 | 정필권 기자 |


▲ 넥슨 배경우 파트장

  • 주제: '삼국지조조전 ONLINE'의 경쟁전(실시간 PvP) 포스트모템
  • 강연자 : 배경우 - 넥슨코리아 / NEXON KOREA
  • 발표분야 : 프로그래밍 / 게임기획
  • 권장 대상 : 로직 프로그래머, 게임 시스템 아키텍쳐, 컨텐츠 디자이너
  • 난이도 : 기본적인 사전지식 필요


  • [강연 주제] 저는 삼국지 조조전 온라인의 실시간 PvP 인 경쟁전을 개발하면서 얻은 경험들을 공유하려고 합니다. 경쟁전 서버/클라이언트의 구조와 구현 방식을 소개하고, 설계/구현하면서 경험한 시행착오들을 바탕으로, SRPG 장르에 실시간 PvP컨텐츠를 추가할 때 고려해야할 사항들을 다루어보려 합니다. 특히 SRPG 장르 에서 실시간 전투 개발을 고려중인 분들에게 조금이나마 도움이 될 수 있을 것으로 생각합니다.

    2016년 10월 국내에 출시한 띵소프트의 '삼국지 조조전 온라인(이하 조조전)'은 팬들에게 있어서 많은 의미를 부여할 수 있는 게임이었다. 삼국지 조조전 이후 18년 만에 정식 출시된 시리즈 타이틀이었기 때문이다. 그리고 긴 시간 동안 게임은 다양한 업데이트를 선보여왔다. 출시 이후부터 지금까지 약 1개월마다 새로운 콘텐츠를 추가하고 있는 모습이다.

    이번 강연의 주제인 '경쟁전'은 삼국지 조조전 온라인이 선보이는 최초의 PvP 콘텐츠다. 올해 1월 업데이트되었으며, 그간 PvE 콘텐츠만 가지고 있던 삼국지 조조전 온라인에 새로운 변화를 선보인 바 있다. 턴제지만 실시간으로 진행되며, 다른 콘텐츠와는 다른 룰을 적용해 매우 다른 느낌을 주는 데 성공했다. 실시간으로 진행되는 만큼, 개발에 많은 공을 들였음이 분명했다.

    조조전 콘텐츠 개발과 유지 보수에 관련된 업무를 담당하는 배경우 파트장은, 이번 NDC를 통해서 조조전의 경쟁전을 만든 과정을 되짚는 시간을 가진다. 실시간 PvP를 만들면서 어떤 난관을 마주했는지. 그리고 이를 어떻게 극복했는지를 청중들에게 전하고자 단상에 올랐다.




    강연은 코딩이나 운영보다는 서버를 구축한 과정을 다룬다. 실시간 PvP인 경쟁전의 서버를 구축하면서 어떤 부분을 고민하고 설계하게 되었는지. 그리고 개발진이 마주하게 된 난관들과 해결해야 하는 과제들을 설명하는 것에 집중했다.

    조조전의 경쟁전은 두 유저가 대전을 펼치고 승패를 가리는 기능이 기초가 된다. 대전에서 나가거나 튕겼을 때 다시 들어와서 플레이를 이어 할 수 있는 '이어하기'도 지원한다. 이외에도 자신이 진행한 대전을 다시 볼 수 있는 리플레이. 복기 기능도 갖췄다. 다른 유저가 진행 중인 전투를 실시간으로 관전하는 기능도 구현했다. 모든 과정에 대한 데이터는 플레이어의 기기(클라이언트)와 서버를 오가며 전달된다.




    데이터 구조는 '배틀 플레이 데이터'와 '배틀 유저', '배틀 컨트롤'로 구분된다. 배틀 유저는 전투 당시의 상황을 저장하는데 사용된다. 경쟁전을 벗어나 보패를 교체해도 기존에 경쟁전을 진행했던 세팅이 유지되어야 하므로 별도로 구분 지었다. 배틀 컨트롤은 이동 및 취소와 같은 중간 과정을 담당하는 부분이다. 이곳의 데이터를 상대에게 보여주는 것은 물론, 복기에도 남게 하여 몰입감을 주기 위해 구분했다.

    경쟁전의 서버 / 클라이언트 구조는 크게 게임 서버와 멀티플레이 서버로 구분할 수 있다. 게임 서버는 웹서버로 구현되어 있고 멀티플레이 서버는 소켓 서버로 구축했다. 다수의 경쟁전 서버가 연결된 형태이며, 클라이언트는 경쟁전 서버 중 하나로 연결하여 전투를 진행한다.




    데이터는 우선 경쟁전 서버로 전송된다. 그리고 받은 정보를 서버의 플레이어 데이터를 기준으로 체크하며, 배틀 플레이 데이터에 변경점을 적재한다. 적재된 정보는 다시 경쟁전 서버로 퍼블리시 요청이 들어가는 순서로 진행된다. 데이터는 이어서 연결된 유저의 클라이언트에 실시간으로 전송이 이루어진다. 하나의 전투가 끝날 때까지 이와 같은 흐름으로 클라이언트와 서버 간의 데이터 교환과 축적이 진행되는 구조다.

    관전은 데이터를 전송하는 것이 아닌 일종의 구독 형태가 된다. 타겟 유저를 정해서 구독하면 해당 유저가 받는 데이터가 관전자들에게도 함께 전달된다. 데이터는 같으며, 통신 과정에서 중계되는 방식이다.




    지난 1월 경쟁전을 업데이트하고 약 4개월이 지난 상태. 서비스는 안정을 찾은 것으로 보이지만, 여기까지 도달하는 데에는 많은 고민들이 있었다. 강연자는 가장 큰 고민거리 중 하나를 '실시간 동기화를 어떻게 구현할 것인가?' 라는 부분이었다고 설명했다.

    크게 입력 동기화와 결과 동기화 중 하나를 결정해야만 했다. 개발 공수와 리스크는 두 방식 모두 가지고 있었지만, 결정적인 차이가 하나 있었다. 전투 로직의 변경 여부가 결정에 있어서 큰 주안점이 됐다. 두 방식을 비교했을 때 전투로직을 수정하지 않는 입력 동기화 방식이 손이 덜 가는 편이었다.

    라이브 서비스를 시작한 지 오랜 시간이 지났기에 전투 로직을 개편하는 결과 동기화는 매우 많은 인력 투입이 분명했다. 수정에 부담이 있는 것은 물론이고 개발과 QA에도 많은 애로사항이 존재했다. 그러므로 최종적으로는 입력 동기화 방식으로 서버 구조를 확정 지었다.




    실시간 PvP를 구현한 것은 좋은 일이었으나, QA 측면에서는 애로사항이 컸다. 관전 테스트까지 해야 했으므로 최소 세 개 이상의 기기가 테스트에 투입되어야 했던 것이다. 이외에도 개발과 테스트. 그리고 라이브 서비스 모두 환경에서 차이가 있다는 점이 문제가 됐다. 더불어 실시간이기에 버그 재현을 하기 어렵다는 문제도 발견됐다.

    이와 같은 문제는 복기 로직을 활용해서 디싱크가 발생한 전투를 재생하는 것으로 우선 해결했다. 또한, 에디터에서 자동 녹화 기능을 추가하여 상황 재현을 위해 노력했다. 문제가 발생했을 때, 로그를 봐도 판단되지 않는다면 영상을 보여 찾을 수 있도록 안배했다. 이외에도 강제 딜레이를 유발해서 쾌적하지 못한 환경을 강제로 만들어 테스트를 진행하기도 했다.




    테스트도 진행하긴 했으나, 라이브 환경에서 예상하지 못했던 문제는 당연히 발생했다. 입력 동기화 방식이 불안정했고, 테스트 당시와 라이브 환경에서의 변수도 차이가 났다. 그리고 다른 콘텐츠에서의 변화가 있을 때, 이를 경쟁전에도 적용 시키려는 경우에 문제가 나왔다.

    현재는 매 턴마다 상황을 비교하여 디싱크를 최대한 빠르게 탐지할 수 있도록 시스템을 구축했다. 디싱크가 탐지되면 이전 턴으로 돌려서 진행하게 하는 방식도 추가한 상태다. 마지막으로 프로그래머 간 코드 리뷰를 강화하여 버그를 방지하는데 노력을 기울이고 있다.




    그렇다면 앞으로 조조전의 경쟁전은 어떻게 변화하게 될까? 디싱크 자체가 줄어들기는 했지만, 아직 디싱크 문제는 남아서 수정 중인 상태다. 강연자는 앞으로 조조전의 경쟁전에서 경험할 수 있는 문제들을 줄이기 위해 노력할 것이라 밝혔다.

    디싱크를 최대한 줄이기 위해서 결과 동기화 쪽으로 시스템을 개선할 필요성을 느꼈다는 설명이다. 또한, 과거의 전투 로직을 그대로 두는 것이 아니라, 연출과 계산 로직을 분리하는 방법을 다른 개발진과 논의 중이다. 추후 1vs1이 아닌, 다수가 참여하는 실시간 전투와 같은 콘텐츠가 나올 수 도 있으니, 적어도 시도할 필요성은 확실한 셈이다. 마지막으로 네트워크 불안정성에 대비한 추가적인 작업과 패킷 안정화를 통해서 더 나은 콘텐츠를 플레이어들에게 선보일 계획이라 강조하며 강연을 마쳤다.



    댓글

    새로고침
    새로고침

    기사 목록

    6 7 8 9 10