Scrolles
Moderador: Sir Cilve Sinclair
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: Scrolles
Hay un truco muy bueno para hacer scrolles que es el que usa Cobra (también experimenté con él cuando probaba mis rutinas de sprites) que consiste en sincronizarte con la primera línea de pantalla (cuando se acaba el borde superior), más o menos sobre el ciclo 14300. Esta sincronización se hace leyendo le puerto $FF hasta encontrar un valor distinto de $FF.
Pues bien, una vez estés sincronizado lanzas tu rutina de scroll. Tiene que ser código de duración fija, hay que pintar las líneas en el mismo orden en que ocurre el raster y lo más importante, tienes que ser igual de rápido o un pelín más lento que el haz de electrones para asegurarte de que siempre escribes detrás de él. Una vez has pintado es scroll lanzas tus rutinas de pintado de sprites que seguro que no tendrás parpadeos. Si reduces el tamaño de pantalla scrollable lo suficiente (50% del área total) puedes conseguir 50fps sin problemas.
Pues bien, una vez estés sincronizado lanzas tu rutina de scroll. Tiene que ser código de duración fija, hay que pintar las líneas en el mismo orden en que ocurre el raster y lo más importante, tienes que ser igual de rápido o un pelín más lento que el haz de electrones para asegurarte de que siempre escribes detrás de él. Una vez has pintado es scroll lanzas tus rutinas de pintado de sprites que seguro que no tendrás parpadeos. Si reduces el tamaño de pantalla scrollable lo suficiente (50% del área total) puedes conseguir 50fps sin problemas.
Última edición por antoniovillena el Mar May 06, 2014 7:45 pm, editado 1 vez en total.
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: Scrolles
Aquí está la demo que te comentaba, no tiene scroll pero se genera el fondo completo en cada frame. Va a 50fps y se pueden mover 12 sprites por pantalla.
http://www.mojontwins.com/mojoniaplus/v ... 4&start=10
http://www.mojontwins.com/mojoniaplus/v ... 4&start=10
- wilco2009
- Freddy Hardest
- Mensajes: 543
- Registrado: Lun Sep 17, 2012 9:40 am
- Ubicación: Valencia
Re: Scrolles
¿Y no se puede utilizar ese método teniendo una segunda pantalla a modo de shadow screen (sin serlo) y pintar los sprites sobre esa shadow?
Luego se lanza la rutina de pintado sincronizada con el barrido de pantalla y listo.
Luego se lanza la rutina de pintado sincronizada con el barrido de pantalla y listo.
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: Scrolles
Se puede pero no ganas nada. Tardas el doble de tiempo porque primero tienes que pintar el scroll, luego los sprites y finalmente volcar a la pantalla principal.
- wilco2009
- Freddy Hardest
- Mensajes: 543
- Registrado: Lun Sep 17, 2012 9:40 am
- Ubicación: Valencia
Re: Scrolles
Sí puedes ganar si no pretendes ir a 50 fps, ya que tienes tiempo de pintar muchos más sprites sin agobiarte por el parpadeo.
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: Scrolles
Este método es para que lo que pintes no se vea en pantalla, por eso pintamos detrás del haz de electrones. Lo que buscas volcando el buffer es todo lo contrario, que lo que pintemos se vea. En este caso el lugar de sincronizar en el ciclo 14300 es mejor (y más fácil) hacerlo en el ciclo cero, te vale con un HALT (o una interrupción IM2). Eso sí, si la rutina de volcado es muy lenta te puede alcanzar el haz de electrones (empiezas con 14300 ciclos de ventaja).
- climacus
- Sabreman
- Mensajes: 411
- Registrado: Mar Ago 25, 2009 1:46 pm
Re: Scrolles
antoniovillena escribió:Hay un truco muy bueno para hacer scrolles que es el que usa Cobra (también experimenté con él cuando probaba mis rutinas de sprites) que consiste en sincronizarte con la primera línea de pantalla (cuando se acaba el borde superior), más o menos sobre el ciclo 14300. Esta sincronización se hace leyendo le puerto $FF hasta encontrar un valor distinto de $FF.
Pues bien, una vez estés sincronizado lanzas tu rutina de scroll. Tiene que ser código de duración fija, hay que pintar las líneas en el mismo orden en que ocurre el raster y lo más importante, tienes que ser igual de rápido o un pelín más lento que el haz de electrones para asegurarte de que siempre escribes detrás de él. Una vez has pintado es scroll lanzas tus rutinas de pintado de sprites que seguro que no tendrás parpadeos. Si reduces el tamaño de pantalla scrollable lo suficiente (50% del área total) puedes conseguir 50fps sin problemas.
Buff!! Algo de esto he leido en WOS pero con el ingles no me enteraba mucho.
Lo de pintar el fondo siguiendo el raster tiene pinta de ser complicadillo...
Y la rutina de pintado de sprites superrapida. Sabes si Cobra usa sprites prerrotados?
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php
http://www.matranet.net/boutique/zx/zx.php
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: Scrolles
Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.
-
- Jack The Nipper
- Mensajes: 146
- Registrado: Mar May 07, 2013 9:42 am
Re: Scrolles
Interesante hilo, por si acaso dejo un link de optimizaciones que de vez en cuando echo una ojeada:
http://wikiti.brandonw.net/index.php?ti ... timization
Enviado con Tapatalk
http://wikiti.brandonw.net/index.php?ti ... timization
Enviado con Tapatalk
- climacus
- Sabreman
- Mensajes: 411
- Registrado: Mar Ago 25, 2009 1:46 pm
Re: Scrolles
antoniovillena escribió:Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.
Ya decia yo que iba muy deprisa todo! Ya me has picado para hacer una rutina de sprites prerrotados.
Creo que el raster va linea a linea de izquierda a derecha. Osea, que en vez de pintar tile a tile completo hay que pintar el primer scan del tile de la izquierda, el primer scan del de su derecha y asi sucesivamente, no?
Pero creo recordar que en Cobra se vuelca el fondo a base de PUSHes, por lo que el proceso es a la inversa...
Todos mis juegos en formato físico
http://www.matranet.net/boutique/zx/zx.php
http://www.matranet.net/boutique/zx/zx.php
-
- Jack The Nipper
- Mensajes: 146
- Registrado: Mar May 07, 2013 9:42 am
Re: Scrolles
Del video estoy viendo líneas de tiles igual a la anterior, no se si lo habrás implementado, sería interesante que haya una rutina que según la posición del mapa compruebe eso, entonces en vez de mirar los datas del mapeado duplique directamente de vram la línea de tiles repetidos a la línea de abajo,
Enviado con Tapatalk
Enviado con Tapatalk
- antoniovillena
- Nonamed
- Mensajes: 1164
- Registrado: Dom Ene 09, 2011 8:55 am
Re: Scrolles
susso escribió:Interesante hilo, por si acaso dejo un link de optimizaciones que de vez en cuando echo una ojeada:
http://wikiti.brandonw.net/index.php?ti ... timization
Interesante. Pero podrían optimizar esto:
Código: Seleccionar todo
foo:
ld hl, data
call bar ; Run routine once
call bar ; .. twice
call bar ; .. three times
bar:
ld a, (hl) ; .. fourth and final time
inc l
and $0F
out (c), a
ret
Por esto otro:
Código: Seleccionar todo
foo:
ld hl, data
call bar1
bar1:
call bar2
bar2:
ld a, (hl)
inc l
and $0F
out (c), a
ret
-
- Jack The Nipper
- Mensajes: 146
- Registrado: Mar May 07, 2013 9:42 am
Re: Scrolles
Pues si, el tuyo es anidado, esa es la lógica de C. XD
Enviado con Tapatalk
Enviado con Tapatalk
-
- Jack The Nipper
- Mensajes: 146
- Registrado: Mar May 07, 2013 9:42 am
Re: Scrolles
Espera, espera.. Tienes más saltos y más returns. Hay más ciclos.
Enviado con Tapatalk
Enviado con Tapatalk
-
- Freddy Hardest
- Mensajes: 619
- Registrado: Vie Dic 28, 2007 2:14 pm
- Ubicación: Valencia
- Contactar:
Re: Scrolles
climacus escribió:antoniovillena escribió:Sí, usa sprites prerrotados. Concretamente 4 rotaciones por sprite (siendo el desplazamiento de 2 pixeles). Y no, no es nada complicado, tan sólo tienes que hacer que tu rutina pinte el fondo rotado sin sprites pero con el mismo orden. Lo importante es coger es la idea.
Ya decia yo que iba muy deprisa todo! Ya me has picado para hacer una rutina de sprites prerrotados.
Creo que el raster va linea a linea de izquierda a derecha. Osea, que en vez de pintar tile a tile completo hay que pintar el primer scan del tile de la izquierda, el primer scan del de su derecha y asi sucesivamente, no?
Pero creo recordar que en Cobra se vuelca el fondo a base de PUSHes, por lo que el proceso es a la inversa...
El raster va, efectivamente, de izquierda a derecha y de arriba a abajo. Para pintar sin que se vea, puedes ir por detrás del raster, o si te da tiempo, aprovechar momentos en medio. Una línea de raster dura 224 t-estados de CPU en el 48k (228 en los demás). El primer pixel se pinta en pantalla 14336 t-estados después de la interrupción. Antes de eso está el borde, lo mismo que tras 57248 t-estados, que es donde empieza el borde inferior (recuerda, todo lo que digo son timings del 48k). Un frame completo son 69888 t-estados.
Cada línea de raster necesita los primeros 128 t-estados de los 224 que dura, así que al final de cada una te quedan 96 t-estados, difíciles de aprovechar, pero posible en teoría. Para hacerlo por PUSH, podrías esperar al estado 57248 y así tendrías 26976 t-estados para actualizar (gestión de la interrupción aparte).
El arkanoid, por ejemplo, dibuja la bola alrededor del t-estado 400 y la borra sobre los 57000. De esa forma, el movimiento de la bola es absolutamente suave.
Debido al fallo de un mecanismo, el lanzagranadas M203 se te podía disparar cuando menos lo esperaras, lo que te habría hecho bastante impopular entre lo que quedara de tu unidad.
Revista del ejército EE.UU. PS, agosto 1993.
Emulador JSpeccy
ZXBaremulator
Revista del ejército EE.UU. PS, agosto 1993.
Emulador JSpeccy
ZXBaremulator
¿Quién está conectado?
Usuarios navegando por este Foro: Ahrefs [Bot] y 11 invitados