Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cómo Almaceno Sprites?

Iniciado por Vivael13h, 13 de Febrero de 2005, 06:18:04 PM

« anterior - próximo »

Vivael13h

 Hola a todos.

Vereis, estoy empezando en programacion 2D, y tengo una duda sobre el uso de sprites, en concreto cómo los guardo en memoria. Si el sprite tiene poca animación, lo que hago es cargar en memoria todos los frames, y los voy mostrando según haga falta. Eso es fácil, pero, ¿y si el sprite tiene muchos frames?. Por ejemplo, en un juego tipo street fighter, donde cada sprite tiene infinidad de movimientos. ¿Cómo lo hago?. Una posibilidad sería ir leyendo del archivo donde tengo los gráficos los frames que necesito. Por ejemplo: pulso el botón de puñetazo, entonces cargo en memoria la parte que corresponda a esa animación y la muestro. Y así voy usando lo que necesito. Pero esto tiene que ser super lento. Otra opción es hacerlo a lo bruto: cuando empieza el combate, leo el archivo que contiene todas las animaciones, es decir, el sheet completo, y lo guardo todo en memoria. Así seguro que es más rápido, pero ocupo mucha memoria (tengo pensado usar sheets muuuy grandes). ¿Qué me aconsejais?

Tengo un embrollo mental tremendo  (nooo) . Ya sabeis, problemas de principiantes...
lgún día volverá el 13h

CoLSoN2

 suponiendo que programas para PCs "actuales" (o unos 3 años de antigüedad), y no para la GBA, no es ninguna brutalidad almacenar en memoria todos los frames de todas las animaciones que vayas a usar en el nivel/combate actual.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

tewe76

 Pues a ver si alguien más te puede ayudar, pero a mi no se me ocurre ninguna otra solución a parte de las dos que comentas. Lo único que en vez de cargarlas todas en memoria gráfica, las cargues en memoria del sistema. Se supone que ésto será más rápido que leer de disco y tendrás más espacio que en memoria gráfica. No sé si te habré ayudado, la intención es lo que cuenta :)
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Astat

 
Citarestoy empezando en programacion 2D

uhmm, esa frase y tu nick, Vivael13h,  no concuerdan.... uhmmm... que rarooo... llamare a Grimson  :P  

Vivael13h

 OK, lo mejor es cargar todo el tocho. Y, por curiosidad, si se da el caso de que la máquina tiene pocos recursos (como la gba), ¿cómo se haría?.

jeje, estoy empezando, pero he programado en muchas cosas, desde el 13h a directx. Y, sin duda, el 13h es lo mejor del universo mundial. Ojalá todo fuera así, otro gallo nos cantaría.
lgún día volverá el 13h

Haddd

 
Citar
jeje, estoy empezando, pero he programado en muchas cosas, desde el 13h a directx. Y, sin duda, el 13h es lo mejor del universo mundial. Ojalá todo fuera así, otro gallo nos cantaría.

Madre mía...pero de donde sales. Tranquilo, si quieres trabajar en ese modo, todavía puedes, no hay ningún problema. Te pillas un MSDOS y ala....

Siento ser tan irónico, pero es que la frase me ha matado. Tenía que decirlo.  :lol:  

Sacrifai

 A mi no me parece tan mal que le guste, yo tambien odio un poco programar en DirectX 9.0 :) .

Vivael13h

 Hombre, el 13h es muy viejito, y hoy por hoy casi no sirve para nada; me refiero a que es un modo facilísimo y muy intuitivo.
lgún día volverá el 13h

_Grey

 Lo "normal" seria cargar en memoria todos los cuadros de animacion, programes en la maquina que sea. Si no caben reduce su numero.

Al margen de estas soluciones "normales" si tu caso es extremo, puedes usar truquillos del estilo de tener en memoria todos los cuadros de animacion pero comprimidos, cuando necesites uno lo descomprimes y lo usas. O tambien tener todas las animaciones de "un lado", por ejemplo caminando a la izquierda , e imbertirla cuando necesites que camine hacia otro lado.

Pero estas ultimas soluciones no suelen ser habituales.... pero  si practicas y sencillas, tu mismo, no te compliques.

Saludos.

sés

 No almacenes los sprites con su RGB (cosa habitual hoy en día <_<). Trabaja en "modo indexado".
Soy indeciso... ¿o no?

Loover

 Si piensas que las memorias en las que va a correr tu juego no van a poder almacenar todos los sprites, recurre al viejo truco de una cache. Ya sabes, ve cargando según sea necesario siempre teniendo en cuenta lo que te queda de memoria libre, si se agota la memoria (o llegas a un porcentaje de 90% de memoria usado por ejemplo) libera los sprites menos "referenciados" es decir, los menos usados, y carga los necesarios.

Lee acerca del algoritmo LRU para procesos de un SO, la idea es la misma.

Un saludo

PD:

No se te olvide recurrir a los viejos trucos de invertir la imagen para cuando camine en sentido contrario, utilizar paletas de colores, color key en vez de canal alfalfa, etc.

PPD:

Dejate el 13h y utiliza mi librería, xD. Te gustarán los scripts de animaciones que usa.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

AK47

 Saludos
Como te han dicho por aqui, carga sin miedo todo en memoria y listos.
Por cierto, si te gusta programa en modo 13h pillate una GP32 y su SDK, que funciona de la misma manera: pantalla de 320x240. Nada de hardware acelerador, simplemente un char * que te dice donde empieza el buffer de pantalla y todos felices  B)  

Vivael13h

 Muchas gracias a todos.
El mensaje de Loover me ha hecho recordar una técnica sobre la que leí hace tiempo (no se cómo se llama esta técnica, si alguien lo sabe que lo diga, es por curiosidad). Creo que la primera vez que se utilizó fue en el Flashback (aunque no me hagais mucho caso). Como en este juego los sprites tenían muchísimos frames, lo que se hacía era ir eliminando los frames de la animación que no eran imprescindibles según iban apareciendo más sprites en pantalla. Así, si por ejemplo el prota tenía 30 frames, cuando aparecía un enemigo se reducían a 27, si aparecía otro bajaba a 25, etc. El único problema era controlar que no haya muchos enemigos juntos para no quedarte sin frames. ¿Sabeis cómo se llama esta técnica?.

Por cierto, Loover, le hecharé un vistazo a tu librería. Muchas gracias.
lgún día volverá el 13h

Loover

 Lo malo de la caché, es cuando hay hiperpaginación (que diga, hiperspritación, xD) es decir, cuando hay demasiados fallos de sprite y te pasas todo el rato cargándolos de disco y liberandolos. Pero es que para lo que quieres, que es usar más memoria de la que realmente tienes, no hay más tu tia que una caché con un buen algoritmo de reemplazo de sprites como un LRU (Least Recently Used), que lo que hace es reemplazar el sprite menos referenciado (usado).

Imagina que tienes una memoria en la que caben 3 sprites

Tienes 10 sprites (nombrados del 0 al 9)

Y tienes una secuencia de animación tal que así:

Secu = 0,2,7,9,9,4,0

Empiezas a ejecutar la secuencía:
                             

0  0  0  9  9  9  9
    2  2  2  2  4  4
        7  7  7  7  0

Es decir, al principio vas asignando sprites conforme tienes huecos, y cuando ya están los 3 huecos que permite esta memoria llenos, eliminas el sprite que se referenció hace más tiempo por el que viene nuevo.

Espero que te sea de ayuda, un saludo.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.