Estoy desarrollando un juego en 2D y tengo muchos sprites. Usé animaciones 3D y modelos para renderizar en 2D, para darles ese aspecto de "Fallout" o "Diablo". También es más fácil que dibujar a mano, jajaja.
Ya he tenido que reducir la velocidad de fotogramas a 15 fps, que fue la más baja que pude bajar sin hacer que tengan un aspecto entrecortado. Sin embargo, fue triste debido a lo increíblemente suave que se veían los 24 cuadros.
Hay dos razones por las que hice esto:
1) Reduzca el espacio en el disco duro. Cuantas menos imágenes, más pequeño será mi juego total.
2) Reducir el consumo de RAM. Cuantas menos imágenes se carguen, más probabilidades tendré de evitar problemas que hinchen mi limitación de RAM.
Sin embargo, si hubiera una manera de comprimir las imágenes tanto en el espacio del disco duro como en la RAM, lo haría. Lo he probado antes, y la mayoría no recibe ningún cambio en la calidad cuando doy de RGBA8888 a RGBA5555 y solo un pequeño golpe al convertir a RGBA4444 en mi programa TexturePacker. Actualmente no hago esto, porque SFML parece usar la misma cantidad de memoria independientemente del tipo de imagen .PNG que sea. Busqué investigar cómo cargarlo de manera diferente, pero no pude encontrar nada sobre el tema.
He leído mucho sobre cómo manejar los videojuegos en 2D. El consenso es abrumador: empaca tus Sprites en una textura más grande para un gran rendimiento. Así que empaco mis pequeños sprites en una hoja de sprites mucho más grande usando TexturePacker.
Sin embargo, planeo tener 10-15 animaciones por personaje, 5 direcciones para mover y 15-40 cuadros por animación (probablemente un promedio de 24). Con 15 animaciones, 5 direcciones y un promedio de 24 cuadros por animación; Eso es 1800 fotogramas individuales por personaje. Si se empaqueta en una hoja de sprite, solo son 75 imágenes. (Una hoja de sprites por Animación, por Dirección. 15 * 5)
Para el gran personaje jefe en el juego, no puedo usar una hoja de sprites y tengo que programar una forma de cargar simplemente una imagen a la vez. Todavía no sé si puedo hacer esto por rendimiento.
Para los personajes, ya los empaqué en una hoja de sprites. Para un solo personaje caminando, esto parece funcionar la mayor parte del tiempo, aunque a veces se detiene. Sin embargo, lo atribuyo a mi código mal concebido que intercambia texturas en lugar de precargar todas las texturas para ese personaje.
Si tuviera que precargar las texturas, tiene sentido para las hojas de sprites. Solo me imagino que es una mala idea precargar 1800 imágenes pequeñas para cada personaje.
Sin embargo, imagino que transmitirlos dentro y fuera de la memoria uno a la vez sería extremadamente rápido, por lo que solo necesitaría tener una sola imagen en la memoria al mismo tiempo. ¿No significa esto que en un momento dado solo haría que cada personaje consumiera unos pocos KB en lugar de 45 + MB?
Me imagino que esto mataría mi rendimiento, ya que la transmisión tendría que ser increíblemente rápida (15 imágenes que entran y salen de la memoria y la representación, por segundo) y aunque las imágenes serían muy pequeñas, podría ser una mejor idea cargar hojas de sprites de caracteres en memoria en su lugar. Pero tendré que codificar un sistema de renderizado de flujo de una sola imagen para mi personaje jefe más grande de todos modos.
He estado experimentando, pero no es un proceso simple. Especialmente dado el hecho de que estoy trabajando en otras partes del motor del juego que no manejan gráficos en este momento.