FFXIV 콘텐츠 생성을 위한 테이블 데이터 관리 시스템 -NEX-

FFXIV 콘텐츠 생성을 위한 테이블 데이터 관리 시스템 -NEX-

2019년 9월 6일 금요일 17:50-18:50 CEDEC 2019

FFXIVコンテンツ製作を支える表データ管理システム –NEX– 2019년 9월 6일 금요일 17:50-18:50

이 세션에서는 FFXIV 콘텐츠 제작에서 테이블 데이터(다양한 매개변수, 텍스트)를 관리하기 위해 어떤 시스템이 사용되는지 설명합니다. 이 시스템은 스프레드시트 소프트웨어(Excel)를 사용하여 콘텐츠 작성자가 데이터를 편집하지만 기존 파일 대신 데이터베이스로 관리됩니다.
데이터베이스 생성의 장점, 데이터 흐름 및 다양한 유용한 기능에 대해 설명합니다.

대량의 데이터를 편집해야하는 RPG의 파라미터 관리는 어떻게 해야할까. 아이템 데이터 하나만 해도…

  • 아이템명
  • 아이템 레벨
  • 레어도
  • … 많은 데이터가 들어간다.

데이터 관리 비교

파판 11에서의 데이터 관리

  • Excel을 활용하여 관리
  • 아이템 및 그에 따른 데이터 한 세트를 하나의 엑셀 파일로 관리
  • 버전관리 소프트웨어(Visual Source Safe)로 이력관리

문제점

  • 버전업마다 대규모 데이터 추가/변경이 이루어져야 했는데
  • 파일단위로만 이력 관리를 할 수 있고
  • 플래너뿐만 아니라 현지화를 포함하여 타인수로 편집하기 때문에 작업이 중복되며
  • 출력 도구가 통일되지 않아서 스크립트에 파라미터를 삽입했다

파판 14 1.0 (구파판14)에서의 데이터 관리

  • ExcelDB를 활용하여 관리
  • 데이터베이스로 관리하지만 인터페이스로서 익숙한 엑셀을 활용

문제점

  • 미들웨어 선정 등 설계 실수가 있었음
  • 기획자가 요구하는 대로 계속해서 기능을 추가했는데
  • 이에 대량의 엑셀 계산식이 필요했고
  • 담당 프로그래머의 기술 부족이 있었다
  • 또한 이력관리를 제대로 하지 못했다

신생 파판14 2.0에서의 데이터 관리

  • NEX(Next ExcelDB)라는 시스템 구축
    • 기존의 데이터베이스와 Excel을 결합한 시스템을 유지하면서 처음부터 시스템을 재구축
  • 미들웨어 재선정
  • 데이터베이스 설계 및 소스 코드의 전면 재검토
  • UI 및 이력 관리 기능 개선
  • 속도가 크게 개선되는 효과를 봄

NEX

  • Excel 애드인 형태로 사용됨 (Excel 인터페이스)
  • MySQL 데이터베이스를 백엔드로 사용
  • 행 단위 체크아웃 및 체크인
    데이터 편집 시 다른 사용자가 동시에 같은 데이터를 수정하지 못하도록 행 단위로 체크아웃/체크인 기능을 지원
  • LOOKUP 기능
    시트 간 데이터를 참조할 수 있는 독자적인 LOOKUP 기능

NEX 시스템 개요

  • KeyJLabelValue… 등등의 컬럼이 존재하는 엑셀: 기획자가 주로 사용
  • NEX
    • 바이너리 파일 및 CSV 파일 제작
    • MySQL 데이터베이스(백엔드)로 주고받는 역할

기획자 작업 내용

  • Excel + NEX: 각종 게임 파라미터 작성, 일본어 텍스트(명사, 단문) 작성
  • 텍스트편집기: 시나리오 텍스트(장문) 작성
  • Lua: 간이 컷신 시퀀스 제어
  • Level Editor: 배치데이터, NPC 위치, 각종 범위, NPC 순회 경로 등

프로그래머 작업 내용

  • 시트 틀 자체는 프로그래머가 잡는다
    • 파라미터를 ‘보기 쉬운 형태’가 아니라 ‘데이터 처리 효율’을 중시해야하므로
  • 프로그램에 필요한 최소한의 파라미터만 열로 추가
    • 게임에 영향이 없는 파라미터는 추가하지 않는다. 프로그래머가 파악하기 어려워짐.

작업 프로세스

  • Excel에 NEX라는 탭이 따로 있음. 그곳에서 ‘시트 추가’ 버튼을 눌러야한다.
  • 그러면 NEX용 시트 작성이 나타난다.
  • 열 작성은 프로그래머가 하고 행의 추가, 삭제는 기획자가 한다.

  • 다음과 같은 Column(열)이 있음
    • Comment: 주석
    • 디폴트값: 공백일때의 채택값
    • Column명: 데이터베이스 및 C++에서 액세스할때의 이름
    • 데이터: 이진법으로 출력할 때의 유형(keyAlias, KeyDevcode, hide, u_int16, string… 등)
    • 출력경로: 파일 이름과 출력경로
    • 계산식 유효(bool): 액셀 계산식을 데이터베이스에 저장할 것인지 결정 (Excel 시트에서 특정 열 또는 셀에 계산식을 사용하는 경우, 해당 계산식을 Excel 안에서만 사용하는 것이 아니라 데이터베이스에도 그대로 반영하고 저장할 수 있도록 함)
    • 16진수 표기법(bool): 수치를 16진수로 표기/입력 여부

데이터 형식

  • lookup 데이터 형식은 다른 시트의 데이터를 참조
  • mask 데이터 형식은 스포일러 방지를 위해 사용
  • 바이너리 포맷을 통일하여 접근 오류를 줄임
  • C++ 접근용 헤더 파일도 자동 생성
  • 출력 경로
    • 시트 정의 시 출력 경로를 지정
    • 클라이언트 및 서버에서 사용할 수 있도록 각각의 경로로 데이터를 출력

최적화

  • VBA에서 C#으로 변경
  • 데이터베이스 엔진을 아파치 더비에서 MySQL로 교체
  • 데이터베이스와 Excel 사이의 http 통신을 중지하고 엑셀에서 직접 DB로 접근
  • SQL 튜닝
  • 엑셀 자체에 접속하는 횟수를 줄임

병렬 작업

  • Excel 파일 자체는 병합이 어려움.
    • CSV나 TSV라면 병합할 수 있지만 컨플릭트 시 해결 스킬을 가진 자가 적었음.
  • 행 단위로 데이터를 잠궈서 해결함.
    • 체크아웃/체크인하여 병렬 작업
    • 편집을 하기 전에 반드시 ‘체크아웃’
    • 셀을 다시 작성한 후 ‘체크인’하면 데이터베이스에 반영
    • 다른 사람이 체크아웃하고 있는 행을 체크아웃할 수 없음

시트 관계 (LOOKUP)

  • 한 시트에서 다른 시트행을 참조하려면?
  • ‘어느 시트’의 ‘어느 행’을 참조중인지 알기 힘들다
  • 엑셀에 VLOOKUP이라는 함수 기능 존재하지만 사용하기 불편함
    • 참조처의 시트를 읽어둘 필요가 있음
    • 시트뿐만 아니라 범위 지정이 필요
    • 계산식을 사용하고 있으면 읽기에 시간이 걸림
  • NEX에서 독자적으로 LOOKUP 기능을 구현
    • 다른 시트의 이름과, 키값을 입력하면 자동으로 다른 시트를 참조
    • 멀티LOOKUP도 가능하도록 구현
    • 게임의 런타임 환경에서 데이터 처리를 효율화하기 위해 고유 키값인 이진 출력된 키를 자동으로 찾아서 사용

다국어

  • 각 언어를 별도의 열로 분리
  • 언어단위로 체크아웃하도록 함
  • 다국어를 동시에 번역 가능한 환경 완성

바이너리 출력 통일

  • 시트마다 바이너리 출력이 제각각이라면…
    • 열이 늘어날때마다 VBA의 변경이 필요
    • C++의 액세스용 헤더가 수동으로 입력해야 했기에 실수가 잦았음
  • NEX에서는 바이너리 출력을 통일함
    • 시트 정의 시에 출력 경로, 즉 최종적으로 어떤 파일 형태로 저장하고, 어디에 저장할 것인지를 미리 결정.
    • 열 단위로 서버/클라이언트 출력 여부를 설정
      • SampleC.exd: 클라이언트만
      • SampleS.exd: 서버만
      • SampleCS.exd: 공용

이력 관리

  • NEX에서 독자적으로 이력관리를 구현
  • 커밋 로그: 체크인 단위로 이력을 확인
  • 버전간의 차이를 시각적으로 비교해서 표시

미출시 콘텐츠 스포일러 방지

  • 유저가 바이너리 파일을 뜯어서 보는 것 자체를 막을 수 없지만,
  • 미출시 콘텐츠가 섞여있다면 스포일러가 된다.
  • 미출시 콘텐츠가 유출되지 않도록 mask 열을 추가
  • 어떤 버전에 공개되는지 라벨을 입력
  • 마스크 된 행은 출력하지 않는다

기타 기능

  • 텍스트 검색 및 관련 시트 표시
    여러 시트를 가로질러 텍스트 검색이 가능하고 필요에 따라 시트 간의 관계를 시각적으로 확인할 수 있는 기능 추가
  • 커맨드 라인 변환
    Excel이 없는 환경에서도 데이터 변환이 가능하도록 하기 위해서, Excel 없이 데이터베이스에서 직접 바이너리 파일로 변환할 수 있는 기능을 추가

© 2022. All rights reserved.