2011-04-06 10 views
5

Por el momento, tengo un sistema en el lugar donde grabo un estado de gamepad en una estructura y lo almaceno en una lista de estados para registrar la entrada durante la duración de un videojuego. El estado completo de la plataforma ocupa 192 bits por cuadro, pero esto es un poco derrochador. Por ejemplo, si los desencadenantes analógicos en el pad no están siendo presionados, aún toman 32 bits arriba, cada uno, en el almacenamiento. Así que, obviamente, estoy buscando ahorrar algo de espacio.Una manera de evitar perder memoria

He intentado establecer esto en NULO pero parece no tener ningún efecto en el tamaño del archivo binario que el sistema guarda al final de la coincidencia.

¿Qué alternativas hay disponibles en una situación en la que solo necesita registrar o guardar ciertos valores, pero conserva la integridad de una estructura de datos?

EDIT:

creo que he encontrado una solución; de tipo. Anteriormente traté de establecer valores en NULL anulando el flotante estándar con System.Nullable en la estructura. Mi idea es que establecer esto en un valor NULL en la estructura se serializará mucho más pequeño. Tengo la impresión de que NULL está registrado como 4bits. Puede ser más, probablemente lo sea. De todos modos, el código que tenía antes tenía una falla bastante obvia, así que volví y lo arreglé de nuevo. Ahora estoy haciendo repeticiones mucho más pequeñas y la precisión parece ser igual de buena, así que voy a suponer que el truco NULL está haciendo algo correctamente.

Respuesta

1

Esto es lo que debes hacer.

Utiliza un flujo de bits para escribir solo los bits de información que hacen la diferencia. En el caso de que tenga muchos datos dispersos, escribe una máscara de bits antes que nada, eso le indica cuáles de los siguientes bits contienen datos.

De esta manera, algo así como un vector se puede reducir a solo 3 bits cero. Si el vector está vacío/cero. Si solo un componente del vector es válido, entonces eso es 3 bits + solo el tamaño de ese componente. Además de esto, puede, por supuesto, agregar compresión, sin embargo, en algún punto, la distribución de los bits (cuando se muestra cortante al respecto) se vuelve muy uniforme. Esto hace que los métodos de compresión de propósito general sean menos óptimos e incluso podrían aumentar el tamaño de su salida.

Y lo que haces es que periódicamente escribes estas cosas en el disco, para que nunca tengas una gran cantidad de memoria en la memoria.

+0

El problema que tuve al escribir periódicamente es que estoy guardando un archivo binario. Puedo usar el modo Agregar para escribir en el archivo pero no se reproduce correctamente; se detiene en el punto en el que se produce la primera escritura y no reproduce nada después de eso. Además, descubrí que el archivo adjunto era enorme. Esto sigue siendo un trabajo en progreso; Estoy tratando de resolver los problemas de uno en uno. –

+0

Algo así como la funcionalidad de reproducción es un trabajo tedioso, porque los errores más leves ensucian todo lo demás. Si tiene problemas con la transmisión y está escribiendo cosas en el disco, intercalando la secuencia de datos con los metadatos y la información de depuración, será de gran ayuda para detectar problemas. Si estás muy ansioso acerca de lo que pones en esa transmisión, la cantidad de datos se acumulará muy rápido, es de 60 FPS pero, ¿también necesitas ejecutar el bucle de entrada del juego a esa velocidad? A menudo, un enfoque de entrada amortiguado con una frecuencia más baja produce tan buenos resultados pero a un costo menor. –

+0

El sistema que estoy haciendo en este momento es en realidad una prueba de concepto que estoy preparando para mi Disertación. El método de grabación que tengo en el momento funciona bien, pero obviamente hay mejoras que podrían hacerse y discutirse sobre el tema. Desafortunadamente, la grabación de entrada para las repeticiones, al menos desde el punto de vista del juego, son pocas y distantes, y lo que he descubierto ha sido bastante vago, así que he estado apuñalando salvajemente en la oscuridad. Echaré un vistazo reduciendo la velocidad de la actualización del juego; gracias por la idea –

2

No en una estructura, creo. Es posible que necesite un protocolo un poco más complicado.

Por ejemplo (muy áspera y no pensado) (¿QUÉ 3xough):

El primer byte contiene el estado de 8 bits botones, uno para cada botón. Si un bit de un botón está configurado en 1, el cliente (por ahora lo llamo el cliente) espera datos más específicos para ese botón, como la dirección y tal, en un orden específico.

1

Es posible dividir su estructura y/o usar una compresión.

Pero el mayor ahorro podría ser guardar durante el juego, no al final.

0

¿Podría almacenar solo deltas, quizás? En muchas situaciones, eso da una buena compresión.

Para los estados del tipo de bit, no cambia el tamaño, solo el significado.

Para sus tipos de flotador, sin embargo, se reduce a 1 bit en la mayoría de los casos, y solo aumenta en 1 bit en los otros casos.

Cuestiones relacionadas