Spritesheet vs. Varias imágenes en Gamemaker

Sawi

Buenas, he estado buscando en internet y no he encontrado información respecto a este tema, asique sabiendo que hay muchos entendidos en Gamemaker por aquí me he animado a preguntar.

¿Hay alguna diferencia de rendimiento usando spritesheets para las animaciónes de personajes en Gamemaker en vez de usando imagenes separadas?

Lo digo porque este verano he estado haciendo pequeños proyectillos para aprender como funcionaba Gamemaker, y ahora que he decidido meterme en algo bastante más gordo que necesitará mucha cantidad de sprites quiero hacer las cosas de la forma adecuada; e imagino que abrir un archivo en vez de una secuencia de ellos será menos trabajoso para un ordenador, pero realmente no sé como funciona gamemaker ni si al final sería contraproducente.

cabron

No uso Gamemaker, pero en general los sprites sheet se usan por que son más eficientes.

El motivo por el que se usan sprites sheet en general, es por que la gráfica solo es capaz de tener una única textura activa en cada momento, si todo lo que necesita dibujar está en la misma textura no necesita activar otra, pero en el momento en que tiene que dibujar algo que está en otra textura tiene que desactivar la actual y activar una nueva, y eso penaliza el rendimiento a la hora de dibujar.

Ahora bien, también es trabajo del motor enviar en la misma operación de dibujo todos los vértices que usen la misma textura, si no se hace así no vale para nada usar un sprite sheet, no te puedo asegurar que gamemaker lo haga ya que no sé nada de él, pero es algo tan básico y tan común que lo normal es que sí lo haga.

1 1 respuesta
Humanoide

segun creo, game maker crea una textura con todos los sprites al exportar... así que si lo que digo es cierto, me imagino que en lo unico en lo que influirá será en el tiempo de procesado de esta textura al exportar?

:\

1
javifugitivo

Digamos que Gamemaker usa los spritesheets para hacer las animaciones de una forma sencilla, dándole una velocidad y hacer un ciclo de imágenes es muy sencillo así.

Por el tema de texturas, no te preocupes siempre que todas las imágenes juntas o separadas en los sprites estén en la misma hoja de texturas (para proyectos grandes, organízatelas bien y asigna cada recurso a su lugar, para no cargar todo de golpe).

Mi recomendación es que si es para un personaje, ese personaje esté formado por varios spritesheets distintos, por ejemplo uno para la animación de parado, otro para correr, otro para saltar, etc. Así te será más fácil montar las animaciones y te ahorras mucho código sólo alternando entre sprite_index.

1
Sawi

Muchas gracias a los tres, y probaré lo que dices javi a ver que tal! Si la cosa va saliendo para adelante enseñaré alguna cosilla para que me deis vuestra opinión, que hay que aprovecharse de la experiencia de los gamediavideros! :P

KeTo

#2 Entonces en general, ¿sería bueno tener un spritesheet para cada "nivel" y de este modo tener sólo una textura en memoria?.

1 respuesta
cabron

#6

No eso no es buena idea, por que las gráficas tienen un límite en el tamaño de las texturas, esto quiere decir que no es lo mismo cargar en la gráfica 4 texturas de 1024x1024 pixels, que cargar una sola textura de 4096X4096 pixels.

Además está el problema de que muchos sprites son compartidos entre distintos niveles, pero otros son únicos de cada nivel, y por simple organización suele ser mejor tenerlos separados, piensa que sería un follón tener que volver a hacer el mega spritesheet cada vez que quieras meter algo nuevo en un nivel.

1
javifugitivo

Veamos el tema de como funciona la memoria en game maker:

Sprites: Game Maker junta todo lo que está asignado en una misma hoja de texturas, sean fondos, sprites juntos o sprites con multiples imágenes (spritesheets). Es cosa del desarrollador el separarlo todo según convenga para optimizarlo. Lo normal, dependiendo de la resolución es usar hojas de texturas entre 1000x1000 y 2000x2000.

Una organización para un juego largo podría ser crear X hojas de textura y asignar los objetos, por ejemplo:

  • Hoja Default: Elementos comunes a todos los niveles, hay quien la deja vacía o como cajón desastre para luego ordenarla.
  • Menus: Gráficos que sólo aparecen en los menús o al iniciar el juego.
  • Juego: Elementos comunes a todos los niveles, cómo puede ser el personaje y sus animaciones, elementos del interfaz, objetos, efectos recurrentes, disparos, etc.
  • Mundo1: Elementos de escenario y enemigos que sólo aparecen en niveles del mundo1
  • Mundo2: Elementos de escenario y enemigos que sólo aparecen en niveles del mundo2
  • Mundo3: Etc.
  • EnemigosX: Si planeas mezclar elementos entre niveles (enemigos especiales que pueden salir en distintos mundos, mejor poner todos aparte.
  • PersonajesX: Lo mismo que con enemigos, retratros, etc.

Además entre "rooms" Game Maker ofrece la función draw_texture_flush(); que limpia toda la memoria de texturas lo que permite gestionar la memoria en plan borrón de lo ocupado en niveles anteriores. Siempre se recomienda usar la función en el primer objeto que se cree en cada nivel, por ejemplo, y un objeto por textura que se desee cargar (cada objeto asignado a una de las hojas de textura que aparezcan, que puede ser de incluso 1 pixel.).

1

Usuarios habituales

  • javifugitivo
  • cabron
  • KeTo
  • Sawi
  • Humanoide