¿Debo usar archivos de texto para mis datos guardados?

22

Mi pregunta es si debo usar archivos de texto para guardar los datos de mi juego. Tengo algunas preocupaciones básicas sobre hacer esto:

  1. Realmente no hay forma de proteger los datos y, por lo tanto, el usuario podría arruinar todo si lo toca y no quiero que eso suceda.

  2. Probablemente no sea la forma más eficiente de almacenar mis datos (Habrá muchos)

Sin embargo, sé cómo analizar / escribir en archivos de texto de manera efectiva, por lo que para la creación de prototipos han sido fantásticos. Solo quiero mirar hacia el futuro por lo que debería pensar en cambiar para que no me golpee en la cara cerca del final del desarrollo.

Si no debo usar archivos de texto, ¿qué debo usar? Necesito algo compatible con C ++.

Althezel
fuente
2
Archivos Zip (con contraseña): hay muchas bibliotecas disponibles que le permitirán hacer esto, y debería ahorrar espacio en el disco
SeanC
2
Aplicar un cifrado simple como en.wikipedia.org/wiki/ROT13 debería ser suficiente para evitar que el usuario promedio edite los archivos. Todos los demás probablemente saben lo que están haciendo de todos modos.
Exilyth
1
Hazlo a tu manera, pero me gusta que mis juegos sean fácilmente modificables.
mmyers

Respuestas:

28

Por ahora, ya que recién está comenzando, los archivos de texto probablemente estén bien. Hay un par de preocupaciones en su pregunta que abordaré.

  1. Proteger los datos no es tan crucial como probablemente pienses. Si tu juego es multijugador, de todos modos tendrás los datos guardados del lado del servidor. Si su juego es para un jugador, ¿qué pasa si los jugadores modifican los datos? Si rompen algo, es realmente su culpa y pueden reinstalarlo.

  2. El rendimiento también es otra cosa que a menudo fallamos en planificar adecuadamente. Realmente no debe optimizar hasta que realmente mida un problema de rendimiento. Mi conjetura es que es probable que tenga una cantidad de datos que no es que los archivos de texto grandes y que van a estar muy bien.

Dicho esto, su mejor opción es abstraer sus rutinas de almacenamiento y carga de datos lo mejor que pueda. Por ejemplo, puede tener una clase base, por ejemplo DataWriter, y luego proporcionar diferentes implementaciones de sus diferentes métodos. Un ejemplo muy básico se vería así:

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

Cuando eventualmente perfiles tu juego y te des cuenta de que el cuello de botella en el rendimiento está en la rutina de escritura de archivos, puedes proporcionar otra implementación de esa clase (por ejemplo, para escribir en una base de datos) con cambios mínimos en el código de llamada.

pwny
fuente
Es un juego para un solo jugador, y esos eran mis pensamientos exactamente si querían meterse con los datos. No sé, algo acerca de los archivos de texto parecía poco profesional, y pensé que si podía evitar que el usuario lo arruinara, probablemente debería hacerlo. Además, ¿qué quieres decir cuando dices "Base de datos"? Escucho mucho eso, pero no tengo idea de la definición exacta o qué tipo de archivo conlleva.
Althezel
66
@Althezel La cuestión es que, independientemente de cómo guarde sus datos, alguien lo suficientemente decidido como para modificarlos podrá hacerlo. En ese sentido, generalmente es un desperdicio de su valioso tiempo de desarrollo intentar poner protecciones en su lugar :)
pwny
@Althezel En cuanto a las bases de datos, considérelo como una especie de motor al que pasa solicitudes para leer o escribir datos. Ese motor es responsable de guardarlo / leerlo de manera eficiente, generalmente en forma relacional en tablas. En su caso de uso, echaría un vistazo a SQLite ( sqlite.org ). Básicamente usaría una biblioteca C ++ para conectarse a una base de datos local de SQLite (SQLite usa archivos locales) y pasaría esas llamadas de biblioteca en sintaxis SQL para acceder a sus datos.
pwny
2
Es un mundo triste cuando los desarrolladores quieren poder bloquear a los usuarios de la información que almacenan en sus computadoras.
ClassicThunder
2
Realmente se siente poco profesional usar archivos de texto porque muy pocos juegos almacenan cosas como "save-data.txt", pero si alguna vez ha pasado tiempo buscando en la mayoría de los archivos de juegos guardados, encontrará que a menudo no son más que archivos de texto que a veces tienen datos binarios agregados a ellos. Todos los juegos de la serie Civilization y Total War, por ejemplo, usan archivos .txt reales para una amplia variedad de datos de juegos. La 'actualización' más común para esto es un sistema de base de datos que termina almacenando los datos como un archivo plano que, a excepción de algunos blobs binarios, es solo un archivo de texto.
BrianH
3

La palabra Datos del juego puede significar muchas cosas, por ejemplo

  • Gamestate
  • Archivos de configuración
  • Mapas, texturas, sonidos, guiones, datos de animación, ...
  • Localización
  • Datos de diseño de la GUI
  • más no pensé en

Para cada categoría puede tomar otro enfoque.

Por ejemplo, podría usar SQLite para material de localización, binario para mapas, texturas, sonidos, etc.

Para cosas de configuración, debe usar archivos xml fáciles de cambiar.

Como siempre, la respuesta correcta es "depende".

Existen muchos analizadores xml con un enlace de c ++ y también existe un enlace de c ++ para SQLite.

Quonux
fuente
Puede ser algo religioso, pero preferiría usar el formato de archivo INI para configuraciones en lugar de XML. Este último se siente como una exageración para este escenario. Y hay un lector INI en las bibliotecas de impulso.
Artur Czajka
0

Podría guardar sus datos como un blob binario y transmitirlos nuevamente cuando acceda a ese archivo. Esto resolvería ambos problemas. Solo asegúrese de que el código de serialización sea exactamente el mismo que la deserialización.

La transmisión en el blob binario es relativamente rápida y también evita que el usuario vea los datos y los cambie.

Puede lograr todo esto utilizando las secuencias de biblioteca estándar.

SuperSquareBoy
fuente
2
Si bien el blob binario es rápido y fácil (tanto para el desarrollo como para cargar / ejecutar), el mayor problema que he tenido con el blob binario es tan pronto como cambie algo sobre la organización de la estructura de datos (tanto como agregar un solo floatmiembro a un solo objeto), los viejos juegos guardados se vuelven completamente inválidos. Esto es difícil de tratar durante el desarrollo, pero si estás preparado, entonces, por supuesto.
bobobobo