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 시스템 개요
Key JLabel Value… 등등의 컬럼이 존재하는 엑셀: 기획자가 주로 사용 - 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 없이 데이터베이스에서 직접 바이너리 파일로 변환할 수 있는 기능을 추가