게임 패치(Game Patch)에 대하여...

개발까마귀·2024년 1월 16일
0

서문

매주 목요일 새벽부터 게임회사가 정기점검하는 공지글을 본적있는가? 짧던 길던 점검이 끝나고 접속시도하면 런처(Launcher)가 실행되어 게임패치받는 화면을 종종 목격했을 것이다. 패치는 왜 하는 것일까? 버그 수정을 위해? 신규컨텐츠 활성화를 위해? 맞는 말이다. 이번에는 이 Patch 이야기를 해볼까한다. (이 포스팅은 PC 온라인게임을 기준으로 작성되었음)

패치 이전에 리소스 구조를 만들어야한다.

패치과정을 들여다보면 이슈가 수정된 리소스(Texture, Mesh, Table....)등을 다운로드하여 덮어쓰기(overwrite)하여 문제를 수정하거나, 새로 추가되는 컨텐츠나 이벤트에 필요한 파일을 추가하거나 수정하는 것으로 보인다. 단순히 파일만 덮어쓸까? 이 과정에는 어떤 고민이 필요할까?

패치를 만들기 이전에 리소스를 어떤 단위로 구분짓고, 관리할 것인지를 고민해야된다. 게임의 리소스는 사용되는 파일의 특성에 따라 다음과 같이 나눌 수 있다.

  1. Table Data
  2. Texture
  3. Mesh
  4. Animation
  5. Shader
  6. Material
  7. Sound
  8. Library
  9. Code & Binary
    ....

이러한 관점의 리소스 분류는 전적으로 프로그래머의 시선으로 나눈 것인다. 이것에 동의 하지 않는 사람이 있는가? 당연히 동의 할 수 없다. 리소스를 저렇게 나누면 작업 단위 관리를 할 수 없다. 이렇게 나누는 것도 적절하지 않을까?

  1. Character
  2. Enemey
  3. Map
  4. UI
  5. BGM
  6. Costume
  7. Weapon
  8. Skill
    ....

어떤가? 이것은 작업단위로 분류한 것이다.

이 리소스의 분리가 패치와 뭐가 관련있는 것일까? 여러분은 당장 다가오는 목요일 정기점검에 1스테이지 보스의 Mesh와 Texture, 관련코드를 수정한 Binary 파일을 패치해야된다. 프로그래머의 관점으로 분류했다면, Mesh, Texture, Binary 를 패치하면될 것이다. 작업 단위의 분류라면 Enemy, Binary 를 패치하면될 것이다. 얼핏보면 후자가 단순해보인다. 하지만 전자의 패치 데이터의 사이즈는 30MB, 후자는 90 MB 라면? 무엇이 더 합리적일까?

정답은 없다. 중요한 것은 리소스를 카테고리(Category)를 정확하게 나누어야, 패치할 데이터를 관리할 수 있고, 패치할 데이터의 사이즈가 작아진다는 사실이다. 패치 데이터가 크면 클수록 유저의 데이터를 더 많이 사용해야되고, 게임 접속까지 기다려야할 시간은 증가한다.

어떻게 패치 할 것인가?

자 그러면 패치 데이터는 어디에 올려야되고? 어떻게 다운받고? 어떻게 게임에 적용시켜야할까?

1. CDN(Content Delivery Network) 준비

패치 데이터는 결국 파일이다. 파일을 다운로드 할 수 있는 공간을 준비해야된다. CDN 을 사용하면된다. 데이터를 저장하는 특별한 위치를 준비하고 그 곳에 게임의 패치데이터를 업로드하면된다. 대표적으로 AWS의 S3 서비스다.

파일을 올리면 끝날까? NO!

다운로드할 리소스는 꼭 갱신할때마다 버전을 매겨서 관리해야한다. 더불어 계약에 따라 CDN 서비스를 제공하는 회사를 옮겨다닐 수도 있다. 이를 위해 SE팀과 협업하고 조율하여 다운로드 도메인(Domain)도 준비해야된다. 이 것이 끝나면 다운로드 공간준비는 끝난다.

2. 최신패치파일 리스트 만들기

다운로드할 파일도 CDN 에 준비했고, 이제 다운로드할 파일 목록을 만들고 다운로드해야한다. 왜 다운로드 목록을 만들어야할까? 그냥 전부 다운로드 하면안되나? 접속 할때마다, 최신패치 적용여부를 확인하고 전부 다운로드 하면된다. 근데 요즘 게임은 다운로드 할 리소스 용량이 기가단위가 넘는다. 심지어 AAA급 게임은 10~20GB는 가볍게 넘어간다. 고작 패치 다운로드에 이 모든걸 다 다운로드 받는건 매우 비효율적이며, 유저의 데이터를 모두 써버리는 불상사가 발생할 수 있다. 그렇기에 실제 업데이트된 파일리스트를 만들어야 한다. 어떻게?

예를 들어, 위의 이미지처럼 CDN의 리소스 최신버전은 2024.01.01 버전이고, 유저의 로컬 PC 의 리소스 버전은 2023.12.15 버전이라고 가정하자. 유저가 접속하여 패치를 받게 된다면 수정된 파일만 받아야된다. 이것에 필요한 것이 버전 문서다. 이는 CDN에 최신버전의 버전정보 문서가 있어야하며 유저 PC 에도 자신의 패치 버전 문서가 존재해야한다. 이를 기반으로 유저 로컬 PC의 버전부터 최신 버전 패치까지 변경사항을 체크하여 리스트를 만든다.
이렇게 만든 리스트를 다운로드 하면 최소한 작업만하면된다. 예제대로라면 우리는 2개 파일을 삭제하고, 2개의 파일을 다운로드해야한다. 어디에서? 런처에서!

3. 다운로드 파일 적용

위의 과정을 통해 최신버전으로 맞추기 위한 파일리스트를 만들었다면 이제 진짜 파일을 적용해야한다. 보통 게임의 리소스는 압축되어 유저에게 제공되는데, 압축된 리소스를 별도 공간에 압축해제하고 수정할 파일을 교체/삭제하고 다시 압축해서 원래 리소스를 덮어쓰면 된다. 심플(런타임의 압축과정이 어렵다면 zlib 를 알아보라, C# 이면 MSDN을 찾아보라. 코드 한줄이면 압축할 수 있다.)하지 않는가?

그럼 압축없이 배포되면? 삭제할 파일 삭제하고, 변경된 파일 복사해주면 끝! 더 쉽다!

4. 데이터 확인

할꺼 다했다. 이제 게임파일이 실행될때 데이터만 로드하고 확인하면된다. 게임에 따라, 엔진에 따라 데이터 파일구조가 다르므로 획일하게 말할 수 없다. 하지만 이 단계가 되었다면 큰문제는 없으리라 본다.

모바일에서는??

우리나라는 스마트폰이 유행하며, 주류 플랫폼이 PC에서 모바일로 판세가 바뀌었다. 그럼 위와 같은 패치과정은 모바일에서 어떻게 해야하는가? 사실 다른게 없다. 똑같다. CDN에 빌드된 리소스를 업로드하고 상용엔진의 리소스 관리 기능(Unity - Addressable, Unreal - Chunk)을 통해 다운로드 하면된다. 파일리스트를 만들고 다운로드하고 이런 작업은 상용엔진 가이드 문서를 따라가기만 하면된다. 오히려 여러가지를 엔진에서 처리해주기에 작업은 많이 단축된다.

마치며...

게임개발을 처음시작하는 분들은 패치에 대해서 생각하지 않는 경우가 많다. 패치 과정은 단순히 단순히 게임 데이터를 전달하는 과정으로 보일수 있으나, 적은 다운로드 사이즈와 리소스 관리가 같이 엮인 부분이라 게임 프레임워크 설계의 철학이 필요한 부분이다.

그리고 한번 개발하면 수정할 일이 거의 없는 프로세스라 신입(+Junior) 개발자는 생각하기 어려운 부분이지 않을까 싶다. 당장은 아니더라도 한번쯤 생각해보자!

Built-in 데이터도 필요한데, 이 부분은 일부러 누락했다. Built-in 데이터가 왜 필요할까? 여러분의 숙제로 남겨놓겠다.

profile
게임 개발자입니다. 안까먹으려고 기록합니다.

0개의 댓글