Estoy desarrollando un juego como Age of Empire (edificios en el mapa) y para cada edificio tengo una hoja de sprites para su animación. Estoy usando animación cuadro por cuadro para animar el edificio (de todos modos, no conozco ningún otro método). Me doy cuenta de que mi carpeta de recursos se está volviendo extremadamente grande debido a las imágenes que estoy poniendo en ella.
¿Cómo los juegos como CoC y Age of Empires mantienen su tamaño de apk por debajo de 50 Mg? ¿Me estoy perdiendo algo aquí cuando se trata del desarrollo del juego?
Gracias
EDITAR: más información sobre el problema que estoy enfrentando
Tengo MUCHAS animaciones de objetos dibujables. Elegí este camino porque era el más rápido y producía los resultados que quería. Básicamente, cada edificio es una animación dibujable en la que su archivo xml se refiere a 8 elementos dibujables (8 imágenes = 8 archivos). Todos ellos son PNG debido a la transparencia. Como tengo más de 200 imágenes, el tamaño del apk es de 120 MB (y todavía no he terminado de copiar la mitad de los archivos). Eso es lo rápido, tiene que haber una manera de resolverlo. Por favor, ayuda a un compañero desarrollador
Respuestas:
No está claro por su pregunta si realmente desea conocer las técnicas que permiten que los juegos ahorren espacio en el disco, incluso cuando tiene grandes cantidades de archivos de imágenes / recursos pesados (eso es lo que está en el cuerpo de la pregunta), o si solo quiere saber si hay menos formas de animación para sus edificios que requieren mucho espacio en el disco (eso es lo que implica el título de su pregunta).
Entonces, pondré esta respuesta aquí tratando de ser de ayuda en relación con el ahorro de espacio cuando tienes muchas imágenes. Si solo está interesado en conocer las técnicas de animación que podrían permitirle ahorrar espacio en el disco, avíseme para que elimine la respuesta.
Dicho esto, en una situación similar, dos soluciones que he visto (y usado una vez) en términos de ahorro de espacio en el disco fueron:
1) para concatenar imágenes individuales dentro de una misma imagen. A veces puede ser de ayuda. Entonces, en lugar de guardar 4 archivos separados para cada uno de los siguientes cuadrados de colores, los guardo uno al lado del otro dentro de la misma imagen (y solo los dividiré a través del código del juego):
En este ejemplo, guardar cada uno en 4 archivos PNG diferentes equivale a 1255 bytes, mientras que el archivo único con todos concatenados es de 451 bytes. Por supuesto, cuánto podría ayudar depende de cada caso y debe probar para ver si eso puede ser de ayuda según sus imágenes.
2) para comprimir la carpeta de recursos. Esto a menudo puede ser muy útil para ahorrar espacio en disco. Luego, cuando el juego se está ejecutando, puedes descomprimir o extraer la imagen deseada del archivo comprimido, dependiendo del formato de compresión que uses. Vea esta respuesta anterior que se convirtió en una wiki de este sitio: /gamedev//a/37649/72423
Pero también tenga en cuenta que cada tipo de compresión puede ser más o menos ventajoso dependiendo del tipo de archivo de imagen que utilice : evite la doble compresión de los recursos
Para más detalles sobre la compresión: ¿ Estado del arte en compresión de imágenes?
Por último, también podría estar interesado en pensar qué tipos de imagen usar para cada situación: ¿Qué formato de imagen es más eficiente en la memoria: PNG, JPEG o GIF?
fuente
Te propondría que pruebes TexturePacker
¿Utiliza un marco de desarrollo de juegos como AndEngine, Cocos2d-x o LibGdx? => Ninguno
¿Necesita cargar todas sus imágenes al mismo tiempo? Parece que te encontrarás con problemas masivos de RAM en los dispositivos de destino.
Actualización: Snake me envió algunas imágenes. Como prometí, no los haré públicos aquí, así que yo mismo creé algo de arte para demostrar cómo reducir el uso de memoria.
En la imagen original, solo una parte de la imagen se estaba moviendo. Coloqué un pájaro en una casa para demostrar esto:
Básicamente, empaquetar la animación completa en una hoja es una gran pérdida de memoria. Debe dividir las partes estáticas y móviles:
Estático:
Anim01:
Anim02:
Mantenga la posición original del pájaro en las imágenes . Por eso hay tanto espacio vacío arriba. Necesita esto para alinear la animación.
Ahora arrastre las imágenes en TexturePacker y seleccione los siguientes parámetros
El resultado es que ahora obtienes 2 archivos: la hoja de sprites y un archivo de descripción JSON.
Las partes importantes son frame y spriteSourceSize .
El marco le brinda la ubicación del sprite original en la hoja de sprite.
spriteSourceSize le ofrece el desplazamiento para dibujar la imagen, las partes de la imagen que quedan fuera debido al recorte:
Una simple rutina de dibujo de pseudocódigo se ve así:
Es posible que deba ajustar el cálculo de desplazamiento según el punto de pivote / origen en su sistema de gráficos. La rutina anterior supone un sistema de coordenadas cuyo origen está en la parte superior izquierda.
Luego simplemente dibuja la casa en 2 pases:
No tiene que preocuparse por los desplazamientos, ya que las imágenes ya están alineadas.
fuente
Aquí hay algunos punteros que puedes usar
Espero que estos consejos ayuden
PD : Solo doy una idea general, ya que no conozco el contenido exacto del juego y mis disculpas si estos consejos no son útiles.
fuente
Muchos juegos no mantienen sus recursos gráficos en el .apk; solo incluyen los "elementos básicos", como los gráficos de la interfaz de usuario y el código del juego, y descargan el resto de los recursos una vez que se ha instalado el juego. Esto es especialmente cierto para los juegos que usan diferentes recursos gráficos dependiendo de la resolución de su pantalla para evitar que .apk tenga que contener recursos de baja y alta resolución.
Debes mirar tanto las opciones de optimización proporcionadas por los otros respondedores, como si finalmente tendrás que servir los gráficos de tu juego por separado del .apk mismo.
fuente
Vine a este sitio en busca de una pregunta similar y, de hecho, hay algunos buenos recursos apuntados tanto en las respuestas a su pregunta como en otras preguntas.
Probablemente deberías echar un vistazo a la animación 2D: ¿modelos 3D animados o sprites con cuadros de animación? para un debate sobre diferentes tipos de animación. Me ayudó a optimizar mi juego. Además, no nos dice qué API está utilizando o qué motor utiliza. Eso solo puede hacer una gran diferencia: animación PNG cuadro por cuadro de Android
Además de eso, tenga en cuenta que si va a ir a la ruta de compresión, puede haber diferencias importantes entre cómo se comprime. Específicamente, existen bastantes diferencias entre los tipos de compresión y existe un debate especializado sobre cuál es la ruta más apropiada para los dispositivos móviles. Especialmente si tiene en cuenta que para dispositivos móviles, el uso de RAM y el desperdicio de CPU para la carga también son primordiales. Ver: http://www.gamasutra.com/blogs/AlexandruVoica/20130419/190833/Why_efficiency_is_key_in_texture_compression_standards_for_mobile_graphics.php?print=1
fuente