Estoy trabajando en una herramienta de edición de nivel que guarda sus datos como XML.
Esto es ideal durante el desarrollo, ya que es sencillo realizar pequeños cambios en el formato de datos y funciona muy bien con datos en forma de árbol.
Sin embargo, la desventaja es que los archivos XML están bastante hinchados, principalmente debido a la duplicación de nombres de etiquetas y atributos. También debido a que los datos numéricos ocupan mucho más espacio que el uso de tipos de datos nativos. Un nivel pequeño podría terminar fácilmente como 1Mb +. Quiero reducir significativamente estos tamaños, especialmente si el sistema se va a usar para un juego en el iPhone u otros dispositivos con memoria relativamente limitada.
La solución óptima, para memoria y rendimiento, sería convertir el XML a un formato de nivel binario. Pero no quiero hacer esto. Quiero mantener el formato bastante flexible. XML hace que sea muy fácil agregar nuevos atributos a los objetos y darles un valor predeterminado si se carga una versión anterior de los datos. Entonces quiero mantener la jerarquía de nodos, con atributos como pares de nombre-valor.
Pero necesito almacenar esto en un formato más compacto, para eliminar la duplicación masiva de nombres de etiquetas / atributos. Quizás también para dar atributos a los tipos nativos, por ejemplo, los datos de punto flotante se almacenan como 4 bytes por flotante, no como una cadena de texto.
Google / Wikipedia revelan que 'XML binario' no es un problema nuevo, ya se ha resuelto varias veces. ¿Alguien aquí tiene experiencia con alguno de los sistemas / estándares existentes? ¿Son ideales para el uso de juegos? ¿Con una biblioteca de analizador / cargador (C / C ++) gratuita, liviana y multiplataforma disponible?
¿O debería reinventar esta rueda yo mismo?
¿O es mejor olvidar el ideal y simplemente comprimir mis datos .xml sin procesar (debería empaquetarse bien con una compresión similar a la de un archivo zip), y simplemente tomar la carga de memoria / rendimiento bajo carga?