Crea tus Juegos con 8BPCursos

8BP: Ejecución alternada y lógica en cascada

4.9
(10)

Hola amigos de 8 Bits de Poder. En el articulo del curso de programación en amstrad cpc de esta semana hablaremos sobre la ejecución alternada y lógica en cascada de la programación con lógicas masivas.

No es necesario que ejecutes todas las tareas en cada ciclo de juego. Por ejemplo, si quieres comprobar si el disparo ha salido de la pantalla, puedes comprobarlo cada dos o 3 ciclos, en lugar de comprobarlo en cada ciclo.

rutas avanzadas

Pero espera… ¿Es posible que no sepas nada de 8 Bits de Poder? Puedes leer el primer artículo del curso de programación en Amstrad CPC de 8BP.

También puedes hacer que los enemigos disparen cada cierto número de ciclos y no cada ciclo (¡de lo contrario te dispararían muchísimo!!)

En definitiva, hay cosas que no necesitas hacer en cada ciclo y puedes ahorrar ejecución de instrucciones por ciclo y por lo tanto lograrás mayor velocidad. Esto es en realidad el fundamento básico de la técnica de “lógicas masivas”.

Ejecución alternada y lógica en cascada

Hay dos técnicas básicas para esto: El uso de aritmética modular y las operaciones binarias AND. Las operaciones binarias AND son más rápidas.

TécnicaTiempo consumido
A = A+1: if A =5 then A=0: GOSUB <rutina>  2.6 ms
IF ciclo MOD 5 =0 THEN gosub rutina1.84ms, suponiendo que ya tienes una variable llamada ciclo que se actualiza

La operación MOD es algo costosa y por ello a veces es mejor una operación binaria.

Suponiendo que tienes la variable ciclo que se actualiza cada vez, podemos hacer una operación binaria para ver cuando un grupo de bits da un determinado valor.

Por ejemplo, si observamos los 4 bits menos significativos de la variable ciclo siempre van a ir desde 0000 hasta 1111 y vuelta a empezar. Pues bien, si hacemos un AND 15 con dicha variable podremos hacer lo mismo que con MOD 15. El número 15 en binario es 1111 y por eso un AND nos revela el valor de esos 4 bits.

TécnicaTiempo consumido
If ciclo AND 15=0 then gosub rutina1.6 ms (se ejecuta una de cada 16 veces)
If ciclo AND 1=0 then gosub rutina1.6ms (Se ejecuta una de cada 2 veces)

Si tienes varias cosas periódicas a ejecutar puedes hacerlo así:

c=ciclo AND 15 :' rem 15 es en binario 1111
IF c=0 THEN GOSUB <rutina1> (se ejecuta "rutina1" una de cada 16 veces)
iF c=8 THEN GOSUB <rutina2>… ( rutina2 se ejecuta una vez cada 16 veces, pero alejado en el tiempo de la ejecución de la rutina1)

De esta forma estás repartiendo el tiempo en distintas tareas, de forma que en cada ciclo sólo haces una tarea, pero al cabo de varios ciclos has hecho todas las tareas.

Para comprobar la variable ciclo y decidir ejecutar una tarea hay una forma de ejecutar las operaciones binarias mejor y es la siguiente:

TécnicaTiempo consumido
10 If ciclo and 7 then 30 20 <instrucciones que se ejecutan cada 8 ciclos> 30 < continuación del programa>1.18 ms. Esta es sin lugar a dudas la mejor estrategia para la ejecución periodica de tareas

Aplicando la misma estrategia a MOD logramos también aumentar la velocidad, aunque menos que con AND. Sin embargo es muy buena por que funciona aunque el periodo no sea multiplo de 2 ( puedes poner MOD 7, MOD 5, MOD 10, etc.)

TécnicaTiempo consumido
10 If ciclo MOD 8 then 30 20 <instrucciones que se ejecutan cada 8 ciclos> 30 < continuación del programa>1.29 ms.  Casi tan bueno como AND y la mejor estrategia cuando necesitamos un periodo que no es múltiplo de 2.

Como ves, por cada tarea que queramos introducir en la lógica, deberemos introducir un “IF”. Sin embargo, aun se puede mejorar y hacerlo más eficiente usando intervalos de tiempo de ejecución de tareas que sean múltiplos. Si son múltiplos, el “IF” de la tarea 2 se puede hacer dentro de la tarea 1, y el de la tarea 3 dentro de la tarea 2, en “cascada”. Esto reduce enormemente el número de IF que ejecutamos en cada ciclo, siendo en muchos casos de un solo IF.

Vamos a ver un ejemplo completo, que te permite mutitarea de 4 tareas diferentes, pero reduciendo el numero de tareas que se ejecutan a la vez. La siguiente secuencia representa el orden de ejecución de las tareas y a continuación el código fuente.

ejecucion-alternada

Puedes comprobar tu mismo el siguiente código ejecutándolo en el emulador. Simplemente copia el código.

10 IF ciclo AND 1 THEN 90
20 REM cada dos ciclos entramos aquí 
25 IF ciclo AND 3 THEN 80
30 REM cada 4 ciclos entramos aquí
35 IF ciclo AND 7 THEN 70
40 REM cada 8 ciclos entramos aquí
50 <tarea 4> : GOTO 100  
70 <tarea 3> : GOTO 100
80 <tarea 2> : GOTO 100
90 <tarea 1>
100 REM - – fin de tareas - – 

En este ejemplo hemos elegido los intervalos 2,4 y 8

  • AND 1 : esto me da un intervalo de 2 porque es cero cada 2 ciclos
  • AND 3 : es cero cada 4 ciclos
  • AND 7 : es cero cada 8 ciclos

Gracias a que hemos elegido operaciones en intervalos multiplo, los IF se ejecutan “en cascada”: solo entramos en un IF si hemos entrado en el anterior:

  • La mitad de los ciclos ejecutan un único IF ( línea 10)
  • La mitad de los ciclos ejecutan 2 IF (líneas 10 y 25), de los cuales, la mitad (es decir un 25%) ejecutarán 3 IF (líneas 10, 25 y 35) 

En media se ejecutan 1*50%+2*25%+3*25%=1.75 sentencias IF por ciclo

Gracias a esta estrategia de usar aritmética modular con operaciones binarias en intervalos múltiplos para hacerlas en cascada, podemos reducir el número de operaciones “IF” al mínimo y a la vez reducimos la complejidad computacional de orden N (n tareas) a orden 1 (una sola tarea por ciclo). Esto acelera muchísimo tus juegos.

Hasta aquí hemos llegado por hoy con el curso de programación en Amstrad CPC de 8 bits de poder Si tienes alguna duda puedes escribir en comentarios y te contestaré lo antes posible.

Todos los recursos, como manuales, ejemplos y juegos compilados de este curso los puedes encontrar en el repositorio Github de 8BP.

Hasta la semana que viene amigos 😄

¿Te ha Resultado útil este artículo?

Ayúdanos a mejorar y danos tu opinión:

Mostrar más

3 comentarios

  1. Un articulo muy interesante como os he comentado por FB, una consulta(no soy programador), está técnica sería lo mismo o similar a las librerías que hay en Arduino para la multitarea verdad?¿, o sea reparto el tiempo en cosas y al ser «extremadamente» rápida la CPU puede hacer varias cosas a la par… sería asi?¿.

    Gracias por el artículo porque me parece de los más interesante.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Mira también
Cerrar
Botón volver arriba