SYNCronizar velocidad juego (variable FRAMES)

Software para o relacionado con el core ZX Spectrum / Software for or related to the ZX Spectrum core
Avatar de Usuario
Uto
Mensajes: 1394
Registrado: 17 Dic 2015, 16:39

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Uto » 01 Dic 2016, 19:51

Sí, tienes el problema de que no sabes a priori cuanto.

Lo que pasa es que eso de poner FRAMES a 0 cuando empieza loop... al menos hazlo justo después de un HALT, porque sino tu puesta a 0 podría ocurrir nada mas saltar la interrupción (con lo cual iría más o menos sincronizado) o en el momento 0,019999999, con lo cual se te desincroniza un "slice" entero, y lo peor es que a cada vez puede pasar en un momento diferente con lo que tu sincronización no va a ser tal.

Avatar de Usuario
Kyp
Mensajes: 240
Registrado: 18 May 2016, 20:16

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Kyp » 01 Dic 2016, 20:03

Cuando termine el proceso, calcula reloj_diff y haz HALTs hasta que valga un nº fijo (el del peor caso por ejemplo) y así todos los procesos durarán lo mismo.

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Haplo » 02 Dic 2016, 00:42

No lo veo claro, creo que lo más fácil es que trabajes con interrupciones directamente, te quitas de rollos y problemas.

Si lo que temes es que te pille el toro y no te dé tiempo a dibujar todos los gráficos, tendrías que trabajar contra la shadow screen y mostrarla sólo cuando esté preparada. Eso es tan sencillo como poner un contador a la entrada de la rutina que responde a IM2, con decirle que cuente hasta 2 (espera 2 halt), tendrás el doble de tiempo para dibujarla pero tu juego irá a 25 FPS lo que tampoco está nada mal.

Igual con los modos turbo te basta y no tienes que meterte con la shadow screen, pero puede ser que alguna vez te salgan gráficos o sprites movidos.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 02 Dic 2016, 01:27

Kyp escribió:Cuando termine el proceso, calcula reloj_diff y haz HALTs hasta que valga un nº fijo (el del peor caso por ejemplo) y así todos los procesos durarán lo mismo.
mmmmm, muy interesante, ;-)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 02 Dic 2016, 01:30

Haplo escribió:No lo veo claro, creo que lo más fácil es que trabajes con interrupciones directamente, te quitas de rollos y problemas.

Si lo que temes es que te pille el toro y no te dé tiempo a dibujar todos los gráficos, tendrías que trabajar contra la shadow screen y mostrarla sólo cuando esté preparada. Eso es tan sencillo como poner un contador a la entrada de la rutina que responde a IM2, con decirle que cuente hasta 2 (espera 2 halt), tendrás el doble de tiempo para dibujarla pero tu juego irá a 25 FPS lo que tampoco está nada mal.

Igual con los modos turbo te basta y no tienes que meterte con la shadow screen, pero puede ser que alguna vez te salgan gráficos o sprites movidos.

Si y no.

He hecho pruebas de pintado en shadow y tarda igual, solo que no lo ves.

Probaré con esto de añadir HALTs al final del loop... que viene a ser como cuando le metes un SDL_Delay(ms);... en espera de empezar el siguiente loop. ;-)

Las interrupciones no las controlo como para usarlas :-(
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
Haplo
Mensajes: 368
Registrado: 05 Oct 2015, 13:51
Ubicación: Ciudad Real

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Haplo » 02 Dic 2016, 02:05

Las interrupciones no es complicado para nada, sólo es cortar/pegar código :)

Con HALT lo que haces es obligar al z80 a esperar el inicio de redibujado de la pantalla, con lo que sí, es una manera de sincronizar porque sería como una puesta a 0 del cronómetro, digamos.
Dependiendo de si te pasas o no de 1/50 de segundo antes de llegar al HALT, tu juego irá a 50,25,12 fps.

Si quieres ver cuantos fps consigues más o menos, ponle un contador a 50 antes del HALT y que cuanto llegue a 0 te cambie el color del borde (out 254,a). Luego al ejecutar puedes ver si tarda 1 segundo en cambiar el borde (50 fps) o 2 (25fps) o lo que sea.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 02 Dic 2016, 07:47

Lo probaré... gracias Miguel ;-)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

Avatar de Usuario
Kyp
Mensajes: 240
Registrado: 18 May 2016, 20:16

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Kyp » 02 Dic 2016, 09:19

Hark0 escribió:
Kyp escribió:Cuando termine el proceso, calcula reloj_diff y haz HALTs hasta que valga un nº fijo (el del peor caso por ejemplo) y así todos los procesos durarán lo mismo.
mmmmm, muy interesante, ;-)
Otra posibilidad es parametrizar el proceso de forma que tenga en cuenta cuantos frames han pasado, por ejemplo muevo un objeto tantos pixeles como frames hayan pasado. Así consigues un movimiento constante a lo largo del tiempo pero el refresco de pantalla será más o menos suave en función de la cantidad de objetos que haya que actualizar en cada momento.

Avatar de Usuario
Hark0
Mensajes: 683
Registrado: 27 Sep 2015, 00:31
Ubicación: Cornellà de Llobregat - BCN
Contactar:

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por Hark0 » 02 Dic 2016, 10:36

Añado enlace a video que acabo de subir....

https://www.youtube.com/watch?v=rQ__RR8Pe08

Como se puede ver... parece que vamos por buen camino... he añadido un WHILE, que espera a que "FRAMES" valga X valor para resetearse y vuelva a empezar el loop principal.

Ahora, a ver cuanto es el límite añadiendo objetos.... y a ajustar parámetros.

Os sigo contando en cuanto lo tenga más ajustado.

Gracias a todos por los post. :okidoki;
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

thEpOpE
Mensajes: 41
Registrado: 10 Oct 2016, 21:35

Re: SYNCronizar velocidad juego (variable FRAMES)

Mensaje por thEpOpE » 06 Dic 2016, 18:45

Esa variable del sistema solo funciona si tienes las interrupciones habilitadas. De otro modo no. De hecho el mejor truco es que tu mismo uses IM2, es como mejor precisión vas a obtener. Además de que podrás deshabilitarlas en los momentos críticos y gestionar toda la sincronizacion con Halt.

Shadow no sirve para generar más rápido la pantalla, sino para mostrar en pantalla un 2° buffer mucho mas rápido (sin usar copias de un buffer en otro con ldir)

Responder