Чи слід використовувати текстові файли для збереження даних?


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
  }
};

Коли ви в кінцевому підсумку профіліруєте свою гру та зрозумієте, що вузьке місце продуктивності знаходиться в рутинному режимі написання файлів, ви можете надати іншу реалізацію цього класу (наприклад, замість цього записати в базу даних) з мінімальними змінами коду виклику.


Це одиночна гра, і саме такі були мої думки, якщо вони хотіли зіпсуватись із даними. Я не знаю, щось про текстові файли просто здавалося непрофесійним, і я зрозумів, чи зможу я утримати користувача від викручування, я, мабуть, повинен. Крім того, що ви маєте на увазі, коли говорите "База даних"? Я чую, що це дуже багато, але я не маю уявлення щодо точного визначення або того, який файл має на увазі.
Альтезель

6
@Althezel Справа в тому, що незалежно від того, як ви зберігаєте свої дані, хтось достатньо рішучий, щоб змінити їх, зможе. У цьому сенсі зазвичай марно витрачати свій дорогоцінний час на розробку, щоб спробувати встановити захист :)
pwny

@Althezel Що стосується баз даних, подумайте про це як на певний механізм, до якого ви передаєте запити на читання або запис даних. Цей двигун відповідає за ефективне їх збереження / зчитування, як правило, у реляційній формі в таблицях. У вашому випадку використання я перегляну SQLite ( sqlite.org ). В основному ви використовуєте бібліотеку C ++ для підключення до локальної бази даних SQLite (SQLite використовує локальні файли) і передаєте цю виклик бібліотеці у синтаксисі SQL для доступу до ваших даних.
pwny

2
Сумний світ, коли розробники хочуть мати можливість блокувати користувачів від інформації, яку вони зберігають на своїх комп’ютерах.
ClassicThunder

2
Використовувати текстові файли справді непрофесійно, тому що дуже мало ігор зберігають речі як "save-data.txt" - але якщо ви коли-небудь витрачали час на пошуки більшості збережених ігрових файлів, ви виявите, що вони часто є не що інше, як текстові файли. які іноді додають до них двійкові дані. Наприклад, у кожній грі серії Civilization і Total War використовуються фактичні файли .txt для найрізноманітніших ігрових даних. Найпоширенішим "оновленням" для цього є система бази даних, яка в кінцевому підсумку зберігає дані як плоский файл, який, за винятком деяких двійкових крапок, є лише текстовим файлом.
BrianH

3

Слово Дані про ігри можуть означати багато речей, наприклад

  • Gamestate
  • Файли конфігурації
  • Карти, текстури, звуки, сценарії, дані анімації, ...
  • Локалізація
  • Дані макета графічного інтерфейсу
  • більше я не думав

Для кожної категорії можна застосувати інший підхід.

Наприклад, ви можете використовувати SQLite для матеріалів локалізації, бінарних для Карт, текстур, звуків тощо.

Для конфігурації потрібно використовувати просту зміну файлів XML.

Як завжди, правильна відповідь - "це залежить".

Існує багато парсерів XML із прив'язкою c ++ та прив'язкою c ++ для SQLite.


Це може бути релігійною справою, але я скоріше використовую формат файлів INI для конфігурацій замість XML. Останній відчуває себе надмірним для цього сценарію. І в читальних бібліотеках є читач INI.
Артур Чайка

0

Ви можете зберегти свої дані у вигляді двійкового блоку та передати дані назад, коли ви отримаєте доступ до цього файлу. Це вирішило б ваші проблеми. Просто переконайтесь, що код серіалізації точно такий же, як і десеріалізація.

Потокове передавання у бінарний блок відносно швидко, а також заважає користувачеві бачити дані та змінювати їх.

Все це можна досягти, використовуючи стандартні бібліотечні потоки.


2
Хоча бінарний блоб швидко і легко (і для розробки, і для завантаження / запуску), найбільша проблема, яку я мав з бінарним блобом, - це як тільки ви щось зміните про організацію структури даних (настільки, щоб додати одного floatчлена до одного об'єкт), старі збереження ігор стають абсолютно недійсними. З цим важко впоратися під час розвитку, але якщо ви до цього ставитеся, то будь-якими способами.
bobobobo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.