¿Mejor forma de restaurar background después de un COPY?

Page 1/2
| 2

By AxelStone

Prophet (2674)

AxelStone's picture

07-01-2015, 15:25

Lo explicaré con una imagen, es más fácil:

Tengo la figura de Cody caminando y para restaurar el fondo a su paso tengo que:
1.- Guardar el background original
2.- En una página de video no visible copio en este orden:
1. El trozo de background que pisa Cody
2. El muñeco de cody
3.- El resultado, lo traigo a la página visible.

Veo que estoy haciendo muchos copys y además necesito una página vacía para componer el resultado. Si no lo hago así, y pego directamente sobre la página 0 el trozo de background y después Cody tengo un efecto "parpadeo" en Cody muy feo. ¿Hay alguna forma de trabajar directamente sobre 0 sin tener parpadeo y así ahorro copys y VRAM?

Login or register to post comments

By Kai Magazine

Paragon (1303)

Kai Magazine's picture

07-01-2015, 15:57

Copio un trozo de mi texto en otro foro:

Si mueves el personaje, deja un rastro de los copys anteriores, con lo que primero, tienes que restaurar el fondo, copiando encima del personaje, y luego copiando el siguiente fotograma con tpset en la nueva coordenada de posicion.

Eso crea un molesto destello y parpadeo si lo haces directamente en la misma pagina, porque veras como se borra el personaje y aparece copiado en la siguiente posicion (lo que le pasa a los enemigos finales del contra, ya que es para 64k de ram y no usa doble bufer)

Hay 2 tecnicas para evitar eso.
Si te sobra una pagina de vram, puedes hacer un doble buffer, usar dos paginas para mostrar los fotogtramas. Mientras una se muestra, restauras el fondo y copias el personaje en otra, y luego muestras esa otra, y trabajas con la primera.

Eso es el doble buffer.

Si no te sobra una pagina de vram (como es el caso) tienes que copiar el trozo de fondo que luego usarás para restaurar en un trocito de una pagina diferente (debajo de los fotogramas del malo), luego copiar ese mismo fondo justo al lado, luego copiar el personaje con transparencia en ese segundo copy, y finalmente copiar el resultado final a la pagina de visualizacion.
Eso implica hacer muchos mas copys y es mas lento, por eso yo siempre uso el doble buffer: 2 paginas de datos, y 2 paginas de visualizacion.
Menos graficos, pero mas rapido, y sin parpadeos.

En este caso, con graficos tan grandes, el doble buffer no sería posible.

By AxelStone

Prophet (2674)

AxelStone's picture

07-01-2015, 16:41

Por curiosidad, ¿cómo se haría con doble buffer? Me refiero, al final también debes componer la imagen "detrás del telón" y solo te ahorras el copy final (el paso 3 de los que pongo) ¿no? El de traer a la página visible, que se cambiaría por un SET PAGE.

Gracias Smile

By Kai Magazine

Paragon (1303)

Kai Magazine's picture

07-01-2015, 22:31

El doble buffer vendria a ser eso. En realidad lo ideal es tener el fondo en una pagina (normalmente en la mayoria de los juegos el fondo no ocupa toda una pagina, si no un 50 a 70 por ciento) el cual se va generando (en caso de que haya scroll) y los personajes en otra.
Asi pues, son solo 2 copys por personaje:
Uno para restaurar el fondo en la pagina no visible, y otro para copiar al personaje con transparencia.

Ademas, con el sistema NO buffer te encontrarás que cuando un personaje esté cerca de otro, el fondo que restaura el segundo personaje, borra al primero.
Por eso se tiene que restaurar el fondo de todos los personajes primero, y luego copiar a los personajes todos de golpe.
En caso de que haya profundidad, como el caso de final fight o de nuts (profundidad me refiero a que unos personajes estan mas cerca de la "camara" que otros) tendras que establecer una jerarquia y copiar primero los que estén mas lejos de la camara, y luego los que estan mas cerca, porque si no, uno que está mas lejos se te copiará encima de uno que está mas cerca, creando una incoerencia en la profundidad.

Eso se hace comparando la coordenada "Y" de cada personaje, y ordenando los personajes del que tiene una Y mas pequeña al que tiene una Y mas grande.

Todo eso son calculos matematicos.

Un truco para acelerar muchisimo los calculos matematicos con variables en turbo basic es definir las variables como enteros.
Eso se hace con:
DEFINT A-Z

Y luego usa solo variables de la A a la Z.

Cuando hay muchos calculos matematicos, veras que la diferencia del DEFINT A-Z es enorme.

Por ejemplo:

10 call turbo on
20 for I = 0 to 8000: next I
30 call turbo off

Ahora prueba asi:

10 call turbo on
15 DEFINT A-Z
20 for I = 0 to 8000: next I
30 call turbo off

Flipa con la diferencia de velocidad.

Otro truquito de turbo basic que aprendí por mi mismo Smile

By Kai Magazine

Paragon (1303)

Kai Magazine's picture

07-01-2015, 22:34

Una pregunta:
Porque no usas el fondo que te pasé con paleta de colores compatible con cody?
Almenos las pruebas no se verian con esos colores tan raros.
No te pasé ese fondo correctamente?
Si no lo hice, dimelo.

Un saludo y animo!

By AxelStone

Prophet (2674)

AxelStone's picture

08-01-2015, 13:21

Tranquilo el fondo es correcto, de hecho tengo los tuyos y los de Toni, solo que la paleta la generé para Cody no para la imagen completa, de ahí que el fondo salga raro y Cody bien.

Lo que comentas de restaurar para varios personajes, la coordenada Y, etc ya te digo, es una comida de coco tremenda. Hace muy pocos días he empezado con esto y la verdad, creo que necesito un poco más de rodaje para hacer el motor completo de un beat'em up, me tomaré Final Fight como aprendizaje sin estar seguro de poder concluir algo decente. En verdad había pensado en algo más sencillo para empezar Cool

Je, ya veo que truquillos conoces unos pocos, la verdad es que molaría documentar todo eso para las generaciones venideras (como un servidor Cool ). Por mi parte voy a intentar comerme un poco la cabeza con el tema de los copys selectivos, igual descubrimos algo que los acelera como han hecho con Street Fighter oO

By Kai Magazine

Paragon (1303)

Kai Magazine's picture

08-01-2015, 14:56

Hace un par de dias Xavi Sorinas me pasó un enlace de un concurso de desarrolladores, donde alguien "filtró" el street fighter de msx cambiandole la caratula y el nombre, pero el juego es el que hemos visto en youtube.
En dicho enlace está la rom para ejecutarla en msx y la he probado.
Debo decirte que los videos que hemos visto en youtube son en Turbo-r. Las voces PCM en msx2 no suenan (hay unos efectos psg bastante horribles), y el juego va mas brusco. A ojo diría que a la mitad de fotogramas por segundo.
Hasta hoy cuando hemos hablado del street fighter de msx, estabamos hablando de su resultado en un turbo-r.
En msx2 la cosa cambia bastante (no deja de ser gráficamente impresionante).

Entiendo que quieras empezar por algo mas simple, ya que un final fight en msx2 no es nada facil, ni para ti, ni para mi, ni para nadie. De hecho te recomendé empezar por algo mas simple, pero esta práctica (hasta donde llegues) te irá muy bien para aprender rápido, ya que es todo un reto.

lo de ordenar los personajes por coordenada Y es complicadillo. Se puede hacer de varias maneras, pero la mas facil (aunque consume mas calculos matematicos) sería comparar la coordenada y de cada personaje contra todas las demas, y si la coordenada y de ese personaje es la menor de todas, la copias, y le pones un marcador (una variable que sea 0 o 1) para que ignore a ese personaje en la siguiente chequeo de coordenadas.
Vuelves a hacer otro chequeo, y dado que el que tenía la coordenada mas baja antes es ignorado gracias al marcador, te dará el resultado del siguiente personaje con la y mas baja, lo copias, lo marcas para que sea excluido del siguiente chequeo, y vuelves a hacer otro chequeo, asi tantos chequeos como personajes haya en pantalla.

By AxelStone

Prophet (2674)

AxelStone's picture

08-01-2015, 17:52

Ostras pues es verdad la MSXDev Compo, al final se ha presentado. ¿Cómo es que nadie ha dicho nada caray, si esto debería anunciarse a los 4 vientos? Acabo de probarlo en MSX2 y me sigue pareciendo espectacular de narices, pero como tu dices ya no lo veo tan de otro mundo, cosa que oye me alegra tela Big smile . Es decir, tal cuál lo veo incluso el Final Fight me parece más jodido con todo lo que mencionas de movimiento en profundidad, repintar en orden...en fin que tiene su guasa.

Mira sobre el pintado en orden pues mira, se pueden ordenar las coordenadas Y con un algoritmo rápido (tipo quicksort) que aunque sea para 3-4 figuras pues mira, con 3.5Mhz cualquier ganancia se agradece.

Después de ver el SF2 creo decididamente que Final Fight se me va un poco de las manos Cool . En fin seguiremos hasta que el cuerpo aguante.

By Kai Magazine

Paragon (1303)

Kai Magazine's picture

08-01-2015, 19:42

Es curioso, en el emulador se me escuchan los samples de las voces del street fighter, pero lo acabo de probar en mi turbo-r gt y no se escuchan. Se oyen los sonidos psg... Que raro...

By pepitor128

Master (155)

pepitor128's picture

08-01-2015, 19:51

El Turbo R en el bluemsx lleva incorporado la moonsound que debe de ser por donde se reproducen los samples de audio. Si pruebas la demo con el openmsx sin poner la moonsound se escucha la musica fm y los sonidos en psg. Creo que el Turbo R no es capaz de reproducir samples en "tiempo real".

By Kai Magazine

Paragon (1303)

Kai Magazine's picture

08-01-2015, 20:13

Ostras! es verdad, lo acabo de comprobar!
entonces hace falta un turb-r con moonsound para que el juego se vea como el video (suave y con voces)
Que engañado me tenia ese video...

Page 1/2
| 2