SYNCronizar velocidad juego (variable FRAMES)
Re: SYNCronizar velocidad juego (variable FRAMES)
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.
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.
Re: SYNCronizar velocidad juego (variable FRAMES)
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.
Re: SYNCronizar velocidad juego (variable FRAMES)
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 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.
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
mmmmm, muy interesante,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.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
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.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: SYNCronizar velocidad juego (variable FRAMES)
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.
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.
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
Lo probaré... gracias Miguel
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: SYNCronizar velocidad juego (variable FRAMES)
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.Hark0 escribió:mmmmm, muy interesante,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.
- Hark0
- Mensajes: 683
- Registrado: 27 Sep 2015, 00:31
- Ubicación: Cornellà de Llobregat - BCN
- Contactar:
Re: SYNCronizar velocidad juego (variable FRAMES)
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.
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.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.
Re: SYNCronizar velocidad juego (variable FRAMES)
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)
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)