게임 컨텐츠를 저장하기 위해 XML / JSON / Text 또는 데이터베이스를 사용하는 것이 더 좋습니까?


29

구성 요소 기반 게임을 구현하는 방법을 고려하고 있는데, 그것이 뜨거운 것 같고 유연한 디자인이라는 아이디어를 좋아합니다. 이러한 디자인의 특징 중 하나는 게임에 새로운 것을 추가하는 것이 종종 XML과 같은 텍스트 파일을 통해 콘텐츠를로드하는 것으로 표현되는 데이터를 통해 수행 될 수 있다는 것입니다. 이것은 모든 텍스트 편집기에서 사람이 읽을 수 있고 쉽게 편집 할 수 있다는 이점이 있습니다. 단점은 텍스트 처리 속도가 느려질 수 있으며 많은 양의 데이터 파일을 관리해야한다는 것입니다. JSON 또는 구성 파일과 같은 유사한 텍스트 기반 형식의 경우 유사한 이점이 있습니다.

다른 한편으로, SQLite 또는 Tokyo Cabinet과 같은 작고 휴대 가능한 데이터베이스가 있습니다. 사람이 직접 읽을 수는 없지만 이러한 파일은 인터페이스하기가 쉽고 게임 콘텐츠 디자인에 어떤 종류의 편집 도구가 더 좋을지 상상합니다. DB를 사용하면 구성 정보를 일관되게 저장하고 쉽게 검색 할 수 있습니다. 게임 저장을 위해 데이터를 DB로 직렬화 할 수 있습니다.

성능 측면에서는 일반적으로 작은 파일의 경우 XML이 더 빠르지 만 데이터베이스는 많은 양의 데이터로 확장하는 것이 좋습니다. 실제 게임에는 많은 게임 오브젝트가있을 것입니다.

따라서 질문 : 선호되는 접근법은 무엇입니까? DB에 기대고 있지만 텍스트 파일에 숨겨진 함정이나 강력한 장점이 있는지 알고 싶습니다. 또는 이것 외에 다른 대안이 있다면 (이진 형식으로 직렬화할까요?)

답변:


18

작은 개인 게임에서는 그렇게 많이 나오지 않지만 게임 데이터와 관련하여 한 가지 어려운 문제는 다중 사용자 편집 / 버전 관리입니다. 빌드 프로세스에 의해 소수의 이진 블로 브로 구워지는 작은 텍스트 파일을 많이 사용합니다. 이를 통해 디자이너는 워크 플로우에 많은 유연성을 갖기 때문에 인생을 더 편하게 만듭니다. CCP는 이에 대한 예로 모든 설계자가 연결하는 중앙 편집 데이터베이스를 사용합니다. 이렇게하면 빌드 단계가 필요하지 않거나 최소한 훨씬 간단 해지지 만 모든 버전 관리 및 워크 플로 기능을 직접 구현해야하므로 다른 도구보다 간단하게 사용할 수 있습니다. 두 경우 모두 성능을 처리 할 수 ​​있으므로 실제 문제는 디자이너 워크 플로에서 무엇을 원하고 어떻게 얻을 수 있는가입니다.


훌륭한 지적입니다. 나는 여러 사람이 작업하는 워크 플로 나 버전 관리를 고려하지 않았습니다. 이것들은 적어도 소스 문서로서 텍스트 파일을 선호하는 아주 좋은 주장입니다. 더 쉬운 도구 지원. 그 관점에 감사드립니다!
CodexArcanum

데이터베이스를 XML로 내보내는 것도 상당히 쉽습니다. 약간의 포워드 계획만으로 구성 요소 로더를 인터페이스로 작성할 수 있습니다. 그런 다음 데이터베이스 리더 또는 xml 파일 리더를 연결하십시오. 구성 요소를 구축하는 동안 모든 파일 조작에 대한 기성 GUI가 여러 파일을 편집하기 때문에 데이터베이스가 더 쉬울 수 있습니다. 그런 다음 최종 빌드 프로세스에서 데이터베이스를 xml로 저장하고 바이너리로 굽는 등 게임의 프로덕션 버전은 적절한 로더를 사용합니다.
Leniency

1
어떻게 도움이 되나요? 사용자 정의 편집기를 사용하여 텍스트 파일로 출력하면 실제로 각 옵션의 최악의 부분이 나타
납니다. -P

7

JSON은 매우 가볍고 이해하기 쉽습니다. 게임에 더 적합하다고 생각합니다. cJSON은 정말 좋습니다. 또한 SQLlite와 동일한 방식으로 소스에 통합됩니다.

XML 파일은 생각보다 사용자가 편집하기 어렵습니다. 당신이 그 길을 가면 사람들이 일반적인 함정을 피할 수 있도록 편집기를 만들 수 있습니다.


나는 XML에 만족하기 때문에 실제로 JSON을 많이 보지 못했습니다. (실제로 훨씬 더 쉬울 수 있습니다.). 데이터 무거움
Spooks

7

나는 파티에 늦었지만 나는 이것을 조사하는 데 많은 시간을 보냈다.

먼저 다음을 사용하지 않는 이유는 무엇입니까?

XML : 지나치게 장황하다. 중복 톤. 필드 이름을 반복 하시겠습니까? 심한

JSON : JSON은 UI 레이아웃에 적합하지만 데이터베이스에는 적합하다고 생각합니다. XML, 중복성 및 딥 네 스팅과 동일한 문제가 있습니다. 심한.

SQL : 설정 문제를 관리하는 경우 훌륭한 옵션입니다. 게임 데이터를 SQL 데이터베이스에 온라인으로 저장하는 모바일 게임을 만들었습니다. 테이블 형식이 좋습니다. 문제는 온라인에서 데이터베이스를 가져 와서 번거로울 수 있도록 설정해야한다는 것이 었습니다. 그러나 SQL은 적절한 솔루션입니다. Unity는 이것을 기본적으로 지원하지 않으며, 내가 시도한 플러그인에는 주요 문제가있었습니다 (버전 제어와 함께 작동 시키려고 할 때 특히 그렇습니다).

마지막으로, 내가 사용하기로 선택한 솔루션이 있습니다 (그리고 나는 그것을 좋아합니다).

CSV : 단순 테이블 형식을 사용할 수 있으며 업데이트해야 할 때 쉽게 참조 할 수 있습니다. 모든 무기에 대한 테이블, 모든 속성에 대한 열 및 각 유형의 무기에 대한 행을 가질 수 있습니다.

Microsoft Excel을 사용할 수 있지만 저장해야 할 때마다 이러한 어리석은 경고가 발생합니다. 매크로를 사용하여 재정의 할 수는 있지만 문제를 해결하고 LibreOffice를 얻으십시오 . 무료이며 CSV 편집을 지원하며 파일을 열면 열 너비가 이름과 일치하도록로드됩니다 (Excel 은이 작업을 수행하지 않아 나에게 견과류를 몰았습니다).

그런 다음 CSV 파일을 게임으로 파싱하면됩니다. Unity를 사용하므로 내가 찾은 멋진 C # CSV 파서를 사용하기 만하면됩니다.

CSV 파서 예제

CSV 파일을 게임 데이터 객체로 변환하면 좋습니다. Unity를 사용하면이를 ScriptableObjects 로 바꿀 수 있습니다 . 그래서 내 워크 플로우는 CSV 업데이트-> CSV를 스크립트 가능한 객체로 구문 분석-> 스크립트 가능한 객체의 데이터를 게임에 사용합니다.


6

이에 대한 대답은 게임에 사용하는 언어에 따라 다릅니다.

C ++를 사용하는 경우 기존 XML 라이브러리 중 하나 (예 : TinyXml 또는 eXpat ) 를 사용하는 것이 좋습니다 .

반면에 PHP를 사용하는 경우 MySQL 또는 SQLite와 같은 데이터베이스 서버를 매우 쉽게 사용할 수 있습니다. (이 경로를 사용하면 데이터베이스 서버가 별도의 프로세스로 실행되고 MySQL과 같은 더 큰 데이터베이스 응용 프로그램이 실행될 때 많은 RAM을 소비 할 수 있기 때문에 더 많은 리소스가 필요합니다.)

JSON은 많은 추진력을 얻고 있으며 응용 프로그램이 둘 이상의 언어를 사용하여 작성된 경우 확실히 최선의 선택입니다.

요컨대, 그것은 당신의 언어로 쉽게 사용할 수있는 것에 달려 있습니다.


1
C ++에서 DB를 사용하는 데 어떤 문제가 있습니까?
Budda

2

XML 영역에 머무르고 싶다면 바이너리 XML 을 사용 하여로드 성능을 향상시킬 수 있습니다 .

예를 들어 Fast Infoset 은 이진 XML의 구현입니다.

FI는 문서 크기와 처리 성능을 모두 최적화하는 반면 gzip은 크기 만 최적화하지만 Fast Infoset은 XML의 gzip으로 생각할 수 있습니다. 원래 형식이 손실되는 동안 XML에서 FI로, 다시 XML로 변환 할 때 정보가 손실되지 않습니다.


아마도 내가 사용하지 않을 것이지만 (XML보다 JSON을 기대하고 있습니다) 나는 링크에 감사합니다.
CodexArcanum

1

나는 데이터베이스를 디자인 해 왔으며 현재 몇 년 동안 많은 게임 아이디어를 가지고 놀았습니다. 현재 개인적으로 가장 좋아하는 것은 구성을위한 일종의 텍스트 기반의 사람이 읽을 수있는 형식이지만 이러한 "느린 스크립트"를보다 실행 가능한 것으로 구문 분석합니다. JAVA 및 .NET과 마찬가지로 런타임 바이트 코드로 컴파일됩니다.

같은 생각이 여기에 간다. 컴포넌트의 "소스"버전을 가지고 있으며 프리 컴파일러 / 파서는 이들을 통해 실행됩니다. 메모리를 너무 많이 차지하면 빠른 SQL 데이터베이스에 저장하거나 이진 파일로 저장할 수 있습니다. 그러나 내 요점은 메모리 또는 SQL 데이터베이스를 작업 공간 / 캐시로 사용하여 스크립트를 반복해서 구문 분석 할 필요가 없다는 것입니다. 컴파일러를 만들고 파싱 된 파일을 "source-lib"로 옮기면 프리 컴파일러가 버전 관리를 수행 할 수 있습니다 (이전 파일을 롤백 목적으로 유지).

"무제한 하드 드라이브 공간"에 관한 경우 Dropbox 또는 Amazon S3와 같은 것에 가입하여 동기화하십시오.

그래서 나를위한 계획은 현재 :

  1. 텍스트 파일로 구성 / 스크립트 / xml (일부 사람이 읽을 수있는 형식) (소스 코드와 동일)
  2. 새 스크립트를 통해 실행되고 규칙을 준수하는지 확인하는 파서 / 검증기
  3. 이진 또는 SQL 행을 원본 파일에서 꺼내어 빠르게 검색하고 빠르게 실행할 수 있도록하는 컴파일러입니다.

안정성과 관련하여 현재 데이터베이스를 "공동 위치 호스팅"으로 설정하고 여러 위치간에 자동 동기화를 수행하고 있으므로 한 위치에서 네트워크 / 하드웨어 장애가 발생하면 다른 사이트에서 동일한 트래픽을 처리 할 수 ​​있어야합니다. 게임 상태.


흥미로운 솔루션, 특히 귀하의 답변이 작성된 후 얼마나 많은 클라우드 호스팅이 번성했는지를 고려하십시오.
rideoutcolin

1

couchdb 를 사용 하면 본질적으로 모든 것을 JSON 구조로 저장합니다. Couchdb는 (복수의) 사용자 데이터를 고통없이 복제 할 것입니다.


0

Unity Wiki 에서 PHP, MySQL 및 C # / JavaScript 가 포함 된 프로 시저를 찾을 수 있으며 목적에 맞게 작동합니다.

세 단계로 구성

  1. 빈 MySQL 데이터베이스와 테이블을 만듭니다.
  2. PHP 서버 측 스크립트를 만듭니다 (이것은 MySQL 테이블에 연결하고 Unity 스크립트에서 데이터를 수신하고 (3 단계) 데이터베이스를 쿼리합니다 (주어진 예는 데이터 삽입 또는 선택))
  3. Unity 컨트롤러 스크립트 생성 (2 단계에서 생성 된 PHP 스크립트에 연결됨)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.