gran dilema con el frame(0)

Started by animanegra, August 05, 2008, 10:36:15 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

animanegra

Holas. A ver un tema con el frame que he visto en la version 0.93(creo que es la 4 pero no estoy seguro, la del cvs que hay fuentes :D) Es para que no deribe el fallo o no fallo en bennu.

El caso es que he visto que al hacer un frame(0) el planificador (¿lo llamo asi o hay un nombre mejor para el que se encarga de dar los turnos de ejecucion a los procesos?) turna los procesos que estan parados con un frame(0). A ver explico como entiendo yo que deberia de ir. Yo entendia que el numero no es como en los sistemas operativos un orden de ejecucion por asi decirlo. Entendia que es el numero de frames que espera el proceso para la siguiente ejecucion, por lo que si pongo un frame(0) entendia que la ejecucion resetearia los valores que pueda tomar el planificador (Por ejemplo las colisiones) y continuaria la ejecucion con el mismo proceso. Por lo que he visto, parece que se crea (es para explicarlo no digo que este hecho asi) una especie de cola de prioridad en la que si hay otro proceso con un frame(0) se turnan(rollo round robbin con los de esa prioridad).

Como digo, no se si es ese la ejecucion esperada, en caso de que sea asi igual se hecha en falta (por cuestiones de facilidad de programacion de cosas al final se puede solucionar de otras formas) de hacer alguna funcion de reseteo de flags sin consumo de frames. Usea ,que no se si me explico, algo que me permita por ejemplo en mi caso resetear las colisiones y que vuelvan otra vez al primer objeto colisionado. (Si existe ya esa funcion o esa señal decidmelo :D pero pregunte ya y nadie me lo dijo).

Y eso. Si no me he explicado en absoluto comentadmelo y intento explicarlo mejor. Si he cometido algun error ortografico comentadmelo para que me pegue con la regla en los dedos ¡¡ZASCA!! y eso.

Lo he puesto aqui porque no sabia donde ponerlo. :D

Saludos a todos. ;-)
"PoCoYo es dios!!"

SplinterGU

#1
Lei en el otro foro que alguien sugirio hacer un "frame(0)" para resetear las colisiones, pero eso no es precisamente correcto. Y como no volvere a responder por esos lados, lo deje pasar.
El "frame(0)" dice "anda a frame y espera 0% de frame para ejecutarme nuevamente", la cosa es que los demas procesos en la lista ya tienen un tiempo menor a 0%, o sea, estan esperando desde antes a ser ejecutados. Por ende, un "frame(0)", lo unico que hace es no tener que esperar que se complete un frame, pero no que se vuelva a ejecutar inmediatamente. Y ese comportamiento es correcto.
Indistintamente de esto, si hay en otro proceso en la lista y en orden de ejecucion anterior al que hizo "frame(0)", por ejemplo, un "frame(10)", el de "frame(0)" no se vuelve a ejecutar sin antes volver a ejecutar el de "frame(10)"... esto se debe a que el valor pasado a frame no es realmente un porcentaje de espera en tiempo, sino un "porcentaje" de ejecuciones, o mejor dicho, un contador que va acumulando el valor suministrado hasta llegar a 100, y es en ese momento que deja de ejecutar la instancia o proceso en cuestion y espera a que el frame este completo. Este acumulador se resetea en cada frame completo.
Aca pongo un ejemplo que hice para ejemplificar este aspecto (compatible tanto en Bennu, en la wip2 hay que quitar el import, como en Fenix):

[code language="bennu"]
#ifdef COMPILER_VERSION
import "mod_say";
#endif

global
    terminar;
end

process uno()
begin
    say("["+id+"] UNO go to frame(0)");
    while(!terminar)
        frame(0);
        say("["+id+"] UNO return from frame(0), go to frame");
        frame;
        say("["+id+"] UNO return from frame, go to frame(0)");
    end
    say("["+id+"] UNO EXIT");
end

process dos()
begin
    say("["+id+"] DOS go to frame(10)");
    while(!terminar)
        frame(10);
        say("["+id+"] DOS return from frame(10), go to frame");
        frame;
        say("["+id+"] DOS return from frame, go to frame(10)");
    end
    say("["+id+"] DOS EXIT");
end

process tres()
begin
    say("["+id+"] TRES go to frame");
    while(!terminar)
        frame;
        say("["+id+"] TRES return from frame, go to frame");
    end
    say("["+id+"] TRES EXIT");
end

private
    i;
begin
    uno();
    dos();
    tres();

    for (i=1;i<4;i++)
        say("--- MAIN Begin ---");
        frame;
        say("--- MAIN End ---");
    end

    terminar = 1;
    say("["+id+"] MAIN EXIT");

end

[/code]

Con respecto a resetear las colisiones es tan simple como hacer un colision pasando como parametro un valor diferente al anterior. Puede ser un collision(0) para mayor performance.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

animanegra

Dios. Porque no me contestastes tu en divsite me hubiese ahorrado mucho tiempo y comidas de cabeza :(. :p Nas. Mi profesora de logica siempre decia lo importante no es el destino si no el camino recorrido, se aprende durante el camino no en el destino :D

Gracias. OK. simplemente como dije, lo ponia porsi era un error. Como vi ese comportamiento pues lo indique. Segun lo que decia creo que ignis y al ver el cero mi forma mental de proceso fue la de pensar que el valor era un tiempo de espera (como lo describia arriba) y al poner cero no cedia el control hacia otro proceso. (¡¡¡Asi me iban a mi los programas que me daban fallos superraros :D!!!)

Pronto presentare el proyectillo, que lo presentare al concurso de juegos de la navarparty (Si se celebra porque lo quieren quitar por falta de gente :'() y no se... probare a compilarlo en bennu y esas cosas :D
"PoCoYo es dios!!"

SplinterGU

Me alegro ser de utilidad.

Lo logico seria que el valor suministrado al frame sea el porcentaje real del frame, pero actualmente es solo un contador, fenix es asi, posiblemente en un futuro bennu corriga esto de forma que hacer esto no implique un sacrificio en la performance. Indistinto a esto, un frame(0), implicara que se ejecute a 0% luego de que se hayan ejecutado todos los pendientes a ejecucion (entiendase, barrida de la lista de procesos).

Bien, cualquier consulta estoy a disposicion por estos lares a resolverla.

Saludos.

PD: Los motivos de no responder en divsite son harto conocidos, mi tiempo ahi ha terminado, como ha dicho el administrador del lugar (palabras de uno de sus moderadores) "GAME OVER" (para SplinterGU y su staff de moderacion), y en mis venas corre sangre y no aserrin, asi que si no soy bien recibido (fuimos echados como perros, y nadie me convence de lo contrario), entonces no participare mas por ahi.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Me acabo de enterar que poniendo FRAME(0) en un processo, sencillamente provoca un pete de todo el programa.
Lo raro es que aqui parece que lo comentais para el uso de otras cosas, pero si el programa se para, no se que utilidad puede tener....
Igual el problema es de las versiones recientes....


PROCESS Pete_General()
BEGIN

  graph = 1;
  x = 100;
  y = 30;
  z = -3;

  LOOP
    FRAME (0);
  END

END

SplinterGU

#5
obviamente que no podes tener frame(0); unicamente... es una cuestion logica...

es necesario que explique por que? piensalo detenidamente y quizas no necesites que te lo explique.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Quote from: SplinterGU on July 11, 2010, 06:29:56 PM
obviamente que no podes tener frame(0); unicamente... es una cuestion logica...

es necesario que explique por que? piensalo detenidamente y quizas no necesites que te lo explique.

Entiendo que es necesario que haya más procesos haciendo FRAME por su parte, pero no termino de entender todo el concepto, ya que es OBESO. ¿Alguna utilidad específica y sencilla para poder comprenderlo mejor? :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

no estas dejando avanzar el frame.
ya que estas diciendo, frame(0) = sali y entra, no avances en tiempo que necesito atencion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

No digo que este mal, pero no sabia que petaba el programa. En DIV no creo que lo haga ya que segun ellos:

Una sentencia FRAME(0), que complete un 0% de la siguiente visualización, puede tener sentido en estos dos casos:

- Puede ser una forma de forzar al sistema a que ejecute en ese punto al resto de los procesos que tienen la misma prioridad que el actual y que, tras ellos, vuelva a ejecutarlo.

- O puede ser una forma de inicializar funciones como get_id() o collision(), pues éstas devuelven unos determinados valores para cada imagen; si se quiere volver a obtener valores de nuevo, se puede ejecutar una sentencia FRAME(0) que estas funciones interpretarán como una nueva imagen.

SplinterGU

#9
claro que tiene sentido, pero no solo (unico frame) dentro de un while, porque no le estas dando oportunidad al sistema de decir, "termine el frame", estas haciendo un "todavia sigo ejecutando"

tiene sentido si en algun vez salis del loop o pones algun frame con un valor mayor a 0 en algun momento.

como sea, ahora mismo como esta hecho todo, es lo mismo poner frame 0 que frame 1, ya que el frame 0, pasa al siguiente proceso, pero cuando se termina la lista de procesos, vuelve a ejecutar el que estuvo en 0, como este nunca completa su frame, el core queda tildando ejecutando este proceso eternamente, y frame 1 evitara que se quede todo congelado, aunque ejecutara 100 veces el proceso por segundo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Un proceso, para terminar el "frame", debe completar un 100% de frame.
Si pones FRAME a secas, es lo mismo que FRAME(100).
Si en el bucle pones FRAME(50), se ejecutará dos veces: 50+50=100.
Pero si pones FRAME(0), jamás se completará el 100% porque vas sumando 0+0+0+0+0+0+0+0... hasta el infinito y más allá. El programa no peta, es que es como si no hubieras puesto FRAME.

FRAME(0) es un frame virtual: es como si no existiera, pero para el planificador ha realizado parte de la tarea. Imagínate una cola en la administración: para pasar, debes ponerte a la cola y rellenar 100 papeles al llegar a la ventanilla. Un FRAME(100) es llegar a la ventanilla y rellenar los 100 papeles, y pasas. Un FRAME(40) es llegar a la ventanilla, rellenar 40 papeles, ponerte a la cola, y repetir el proceso hasta tener los 100. Un FRAME(0) es llegar a la ventanilla, no rellenar ningún papel y volverte a poner a la cola. Hasta que la cola no se vacía, no se puede cerrar la administración para empezar una nueva jornada ;D
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

muy bien explicado drumpi! hoy estas inspirado. :)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2