저장 데이터에 텍스트 파일을 사용해야합니까?


22

내 질문은 게임 데이터를 저장하기 위해 텍스트 파일을 사용해야하는지 여부입니다. 이 작업에 대한 몇 가지 기본 문제가 있습니다.

  1. 실제로 데이터를 보호 할 방법이 없으므로 사용자가 데이터를 만지면 모든 것을 망칠 수 있으며 그 일이 일어나기를 원하지 않습니다.

  2. 아마도 내 데이터를 저장하는 가장 효율적인 방법은 아닐 것입니다 (많이있을 것입니다)

텍스트 파일을 효과적으로 파싱 / 작성하는 방법을 알고 있으므로 프로토 타입 제작에 환상적이었습니다. 나는 단지 전환에 대해 생각해야 할 것에 대해 미래를 바라보고 싶습니다. 그래서 개발이 끝나는 시점에 직면하지 않습니다.

텍스트 파일을 사용하지 않아야한다면 어떻게해야합니까? C ++ 호환이 필요합니다.


2
Zip 파일 (비밀번호 포함)-이 작업을 수행 할 수있는 라이브러리가 많이 있으며 디스크 공간을 절약해야합니다.
SeanC

2
en.wikipedia.org/wiki/ROT13 과 같은 간단한 암호를 적용 하면 일반 사용자가 파일을 편집하지 못할 수 있습니다. 다른 사람들은 아마 그들이하고있는 일을 알고있을 것입니다.
Exilyth

1
나만의 방식으로 진행하지만 내 게임을 쉽게 수정할 수 있기를 바랍니다.
mmyers

답변:


28

지금 막 방금 시작 했으므로 텍스트 파일은 괜찮을 것입니다. 귀하의 질문에 몇 가지 우려 사항이 있습니다.

  1. 데이터 보호는 생각만큼 중요하지 않습니다. 게임이 멀티 플레이어 인 경우 어쨌든 서버 측에 데이터가 저장됩니다. 게임이 싱글 플레이어 인 경우 플레이어가 데이터를 수정하면 어떻게 되나요? 그들이 무언가를 깨 뜨리면 그것은 실제로 그들의 잘못이며 다시 설치할 수 있습니다.

  2. 성능은 또한 우리가 종종 제대로 계획하지 못하는 다른 것입니다. 실제로 성능 문제를 측정 할 때까지 실제로 최적화해서는 안됩니다 . 내 생각 엔 당신은 아마없는 데이터의 양을해야한다는 것입니다 것을 큰 및 텍스트 파일이 잘 될 것됩니다.

즉, 최선의 방법은 데이터 저장 및 로딩 루틴을 최대한 추상화하는 것입니다. 예를 들어, 기본 클래스를 말하고 DataWriter다른 메소드의 다른 구현을 제공 할 수 있습니다 . 매우 기본적인 예는 다음과 같습니다.

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

결국 게임을 프로파일 링하고 성능 병목 현상이 파일 쓰기 루틴에 있다는 것을 알게되면 호출 코드를 최소한으로 변경하여 해당 클래스의 다른 구현 (예 : 데이터베이스에 쓰기)을 제공 할 수 있습니다.


그것은 단일 플레이어 게임이며, 그들이 데이터를 망쳐 놓고 싶다면 정확히 내 생각이었습니다. 나는 텍스트 파일에 대해 뭔가 전문적이지 않은 것처럼 보였고 사용자가 실수하는 것을 막을 수 있다고 생각했을 것입니다. 또한 "데이터베이스"라고 할 때의 의미는 무엇입니까? 나는 그것이 많이 던져 졌다는 것을 들었지만 정확한 정의 또는 어떤 종류의 파일에 관한 것인지 전혀 모른다.
Althezel

6
@Althezel 문제는 데이터 저장 방법에 관계없이 데이터를 수정하기에 충분한 사람이 결정할 수 있다는 것입니다. 그런 의미에서, 일반적으로 당신의 소중한 개발 시간을 낭비하고 보호를하기 위해 노력합니다 :)
pwny

@Althezel 데이터베이스는 데이터를 읽거나 쓰는 요청을 전달하는 일종의 엔진이라고 생각하십시오. 이 엔진은 일반적으로 테이블에서 관계형으로 효율적인 방식으로 엔진을 저장 / 읽는 역할을합니다. 귀하의 유스 케이스에서는 SQLite ( sqlite.org )를 살펴 보겠습니다 . 기본적으로 C ++ 라이브러리를 사용하여 로컬 SQLite 데이터베이스에 연결하고 (SQLite는 로컬 파일을 사용함) 해당 라이브러리 호출을 SQL 구문으로 전달하여 데이터에 액세스합니다.
pwny

2
개발자가 자신의 컴퓨터에 저장된 정보로부터 사용자를 잠그고 싶어하는 것은 슬픈 일입니다.
ClassicThunder

2
게임이 "save-data.txt"로 저장되는 게임이 거의 없기 때문에 텍스트 파일을 사용하는 것은 전문가가 아닌 것 같습니다. 그러나 대부분의 저장된 게임 파일을 살펴 보는 데 시간을 보낸다면 종종 텍스트 파일에 지나지 않습니다. 때로는 이진 데이터가 추가되어 있습니다. 예를 들어, 모든 Civilization 및 Total War 시리즈 게임은 다양한 게임 데이터에 실제 .txt 파일을 사용합니다. 이것에 대한 가장 일반적인 '업그레이드'는 데이터를 플랫 파일로 저장하는 데이터베이스 시스템입니다. 일부 바이너리 블롭을 제외하면 텍스트 파일 일뿐입니다.
BrianH

3

예를 들어 게임 데이터라는 단어는 많은 것을 의미 할 수 있습니다.

  • 게임 스테이트
  • 구성 파일
  • 지도, 텍스처, 사운드, 스크립트, 애니메이션 데이터 등
  • 현지화
  • GUI 레이아웃 데이터
  • 더 생각하지 않았다

각 카테고리마다 다른 접근 방식을 취할 수 있습니다.

예를 들어 지역화 항목에 SQLite 를 사용 하고지도, 텍스처, 사운드 등에 이진을 사용할 수 있습니다 .

구성을 위해서는 XML 파일을 쉽게 변경할 수 있어야합니다.

항상 그렇듯이 정답은 "의존"입니다.

c ++ 바인딩을 가진 많은 XML 파서가 있으며 SQLite에 대한 c ++ 바인딩도 존재합니다.


종교적인 일이지만 XML 대신 구성에 INI 파일 형식을 사용하고 싶습니다. 후자는이 시나리오에서 지나친 것 같습니다. 부스트 라이브러리에는 INI 리더가 있습니다.
Artur Czajka

0

데이터를 이진 Blob으로 저장하고 해당 파일에 액세스 할 때 데이터를 다시 스트리밍 할 수 있습니다. 이렇게하면 두 가지 문제가 모두 해결됩니다. 직렬화 코드가 직렬화 해제와 정확히 동일한 지 확인하십시오.

이진 Blob의 스트리밍은 비교적 빠르며 사용자가 데이터를보고 변경하지 못하게합니다.

표준 라이브러리 스트림을 사용하여이 모든 것을 달성 할 수 있습니다.


2
이진 BLOB 빠르고 쉽게 동안 (모두 dev에하고로드 / 실행에)이 가장 큰 내가 진 덩어리로 했어 문제는 바로 변화에 따라입니다 어떤 데이터 구조 조직에 대한을 (많이와 같은 단일 추가 float한에 회원을 이전 저장 게임이 완전히 무효화됩니다. 이것은 개발 과정에서 다루기가 어렵지만, 당신이 그것에 달려 있다면, 반드시.
bobobobo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.