[SAMPLE] Uso de rutinas locales

Started by SplinterGU, March 14, 2016, 03:57:01 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

Hace tiempo, mucho tiempo... implemente los CALL, GOTO, etc... intente buscar un ejemplo, pero no encontre... asi que aca pongo uno


import "mod_say";

global
    int a, i;

begin
    a = 1;
    say(a);

    for (i = 0; i < 10; i++)
        call inc_a;
        say(a);
    end
    return;

inc_a:
    a = a + 1 ;
    return;

end


Beneficios de esto? son mucho mas rapidas que las funciones normales, consumen menos memoria, comparten las variables del proceso (en algunos casos puede ser ventaja y en otros desventajas)... y quizas otras mas que no se me ocurren...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

warrior_rockk

Entiendo que sin el primer return ejecutaría la línea de inc_a: por ser una especie de label ¿cierto?

Drumpi

Anda, pues eso viene mejor que lo que hice con el motor de scroll tileado: coger el trozo de código que se repite, escribirlo en un fichero aparte, y poner una línea "include" donde debería ir esa "función" :D
¿Por casualidad recuerdas más o menos la versión en la que se implementó?

Por cierto, en Fenix se implementaron las "corutinas" (o las "rutinas", no recuerdo el nombre exacto, y seguro que lo ando confundiendo con alguno de C#). Se escribían como las funciones, pero si el compilador detectaba que no se usaban variables locales (y creo que globales), se almacenaba como corrutina, que es una función con menos carga a la hora de generarse en memoria y de ejecución más rápida. No sé si eso se trasladó a BennuGD.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: warrior_rockk on March 14, 2016, 11:42:35 AM
Entiendo que sin el primer return ejecutaría la línea de inc_a: por ser una especie de label ¿cierto?

cierto
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: Drumpi on March 14, 2016, 04:40:57 PM
Anda, pues eso viene mejor que lo que hice con el motor de scroll tileado: coger el trozo de código que se repite, escribirlo en un fichero aparte, y poner una línea "include" donde debería ir esa "función" :D
¿Por casualidad recuerdas más o menos la versión en la que se implementó?

Por cierto, en Fenix se implementaron las "corutinas" (o las "rutinas", no recuerdo el nombre exacto, y seguro que lo ando confundiendo con alguno de C#). Se escribían como las funciones, pero si el compilador detectaba que no se usaban variables locales (y creo que globales), se almacenaba como corrutina, que es una función con menos carga a la hora de generarse en memoria y de ejecución más rápida. No sé si eso se trasladó a BennuGD.

hace mucho se implemento.

las "corutinas" que dices, son procesos que se comportan como funcion... sigue igual, pero sigue siendo pesado...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

Working on Anarkade. A couch multiplayer 2D shooter.

warrior_rockk

Me temo que al ser un salto a etiqueta con retorno, no puedes parametrizarlo. Puedes crearte variables globales como parametros e iniciarlos con valores antes de llamar a la rutina...

SplinterGU

no es necesario crear variables globales, siendo parte del mismo proceso que las llama, estas "rutinas" tienen acceso a las mismas variables del proceso "llamador", asi que directamente lees/tocas las variables que le ibas a pasar por parametro.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

mmm, entiendo, buena idea. Voy a ver si puedo implementarlo en el motor de durezas para ver si mejora el rendimiento.


Splinter, vos que conoces bien Bennu, vos crees que eliminando un par de llamadas a funciones usando CALL en cada frame, deberia haber una mejora en el rendimiento ?
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

Quote from: JaViS on March 29, 2016, 01:55:29 PM
mmm, entiendo, buena idea. Voy a ver si puedo implementarlo en el motor de durezas para ver si mejora el rendimiento.


Splinter, vos que conoces bien Bennu, vos crees que eliminando un par de llamadas a funciones usando CALL en cada frame, deberia haber una mejora en el rendimiento ?

deberia... a menos que el cuello de botella este en el render... (puede pasar...)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

warrior_rockk

Quote from: SplinterGU on March 29, 2016, 12:27:44 PM
no es necesario crear variables globales, siendo parte del mismo proceso que las llama, estas "rutinas" tienen acceso a las mismas variables del proceso "llamador", asi que directamente lees/tocas las variables que le ibas a pasar por parametro.


Pero, entiendo que, la utilidad de esto es llamar a esas rutinas desde otros procesos. En ese caso, ¿se comporta como una extensión de código del proceso que las llama? Con lo que, ¿puedes acceder a las variables del proceso que realiza el salto?

SplinterGU

no, son dentro del mismo proceso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

warrior_rockk

mmm quizás no lo entendí bien.. Si sólo lo puedes usar dentro del mismo proceso, entonces no se comporta como una alternativa a usar funciones ya que, simplemente es código añadido a un proceso. ¿que utilidad tiene entonces?

SplinterGU

que la puedes llamar desde muchas partes del mismo proceso, al igual que una funcion... si lo ves asi, una funcion tambien es codigo añadido a un fuente... lo unico que varia es el scope (y los parametros, claro esta)...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Es como si cogieras e hicieras un copy/paste de un trozo del proceso que se va a repetir. Según las normas de estilo, eso está mal, porque para eso se crearon las funciones, pero como crear una función tiene un coste de computación (reservar espacio, crear variables, copiar datos, destruir la función...) se supone que esto es más rápido.
A mi, en mi caso particular, no he obtenido una mejora visible (aunque tampoco he podido hacer una medición objetiva), y quizás sea más conveniente probar lo que me recomendaba Splinter de usar #define... u otra aproximación diferente al algoritmo.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)