Frame parcial.

Started by HaCkZJuaNN, November 01, 2011, 04:08:52 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

HaCkZJuaNN

Un par de dudas a este respecto.

1. Cuánta "precisión" tiene?

Ejemplo:

process A()
begin

loop
/* Codigo 1A */
frame(1);
/* Codigo 2A */
frame(99);
end

end

process B()
begin

loop
/* Codigo 1B */
frame(1);
/* Codigo 2B */
frame(99);
end

end


Puedo estar seguro de que Codigo 1A y Codigo 1B SIEMPRE se ejecutarán ANTES que Codigo 2A y Codigo 2B (aunque el orden entre ellos varíe)??

Y si hago frame(0.1)? Y frame (0.0001)? Cuál es el mínimo para estar seguro de que hay sincronización?

En otras palabras, en cuantos bloques de ejecución atómicos puedo separar cada frame?




2. frame; == frame(100); ???

Si yo hago frame(32); y luego frame(27); y luego frame; eso me deja en el punto 59% del siguiente frame, o me deja al comienzo del siguiente frame?

O sea, frame a secas me hace un frame de 100 o me recorre HASTA que acabe el frame?

En esta línea, es posible que lo esté entendiendo mal y frame(x) no signifique AVANZAR x en el frame, sino avanzar HASTA x. De forma que:


process A()
begin

loop

/* Codigo 1A */
frame(10);
/* Codigo 2A */
frame(50);
/* Codigo 3A */
frame;

end

end

process B()
begin

loop

/* Codigo 1B */
frame(50);
/* Codigo 2B */
frame;

end

end



Esto me aseguraría que Codigo 2A se ejecute siempre antes que Codigo 2B?? O el frame(50) me lleva hasta 10+50 = 60, y por tanto, es posible que Codigo 2B, que se ejecuta a partir de 50; se ejecute antes que Codigo 2A (que sólo tiene garantizado que se ejecuta antes de 60).


A grandes rasgos, no entiendo qué hace exactamente un frame parcial :)

Gracias por todo de nuevo.

Drumpi

Primero: FRAME == FRAME(100) hasta donde yo sé.

Lo de los frames parciales es un poco engañoso. Tal como los entendí en su día (no sé si ha cambiado la cosa), todos los procesos se añaden en una lista de "procesos pendientes de ejecución". El orden se determina por el algoritmo interno, o por la variable local PRIORITY.
Los procesos que ejecutan el 100% de su frame pasan a la lista de "ejecutados". Los que no, vuelven al final de la lista de "pendientes", y esto es así independientemente del porcentaje que se haya ejecutado, el porcentaje indica las veces que volverá a ponerse al final de la cola, pero no el orden.
Para forzar el que se ponga al final de la cola, existe el truco de usar FRAME(0), que no incrementa el porcentaje, pero ejecuta las instrucciones previas a él.

Pero sí, sincronizar procesos es un peñazo, por eso, en otros lenguajes se usan una cosa llamadas señales, u otras llamadas semáforos. En Bennu es algo más complicado, pero si te ves en apuros, siempre puedes crear un proceso que controle ambos procesos, y que estos los dividas en las diferentes fases que necesitas.
Es más, existe un método en el que se usa un SWITCH para que, dada una variable de entrada, empiece en una sección determinada, pero esto requiere crear y destruir procesos constantemente (o no).
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

como ha dicho drumpi, los frames parciales no son porcentajes reales... en realidad indican la cantidad de veces que se ejecutara un proceso antes de que su frame se complete...

si tengo proceso A con un frame(50), quiere decir que ese proceso se ejecuta 2 veces en el frame (50x2=100)
si tengo proceso B con un frame(10), quiere decir que ese proceso se ejecuta 10 veces en el frame

pero eso no indica que el proceso A se ejecuta cada 5 veces del proceso 10, significa que proceso A se ejecutar 2 veces antes de completar si frame y proceso B 2 veces.

graficandolo.

-- aca empieza un frame completo -------------
1.
ejecuto proceso A (frame(50))
ejecuto proceso B (frame(10))
ejecuto proceso C (frame)
2.
ejecuto proceso A (frame(50))
ejecuto proceso B (frame(10))
3.
ejecuto proceso B (frame(10))
4.
ejecuto proceso B (frame(10))
5.
ejecuto proceso B (frame(10))
6.
ejecuto proceso B (frame(10))
7.
ejecuto proceso B (frame(10))
8.
ejecuto proceso B (frame(10))
9.
ejecuto proceso B (frame(10))
10.
ejecuto proceso B (frame(10))
-- aca termina un frame completo -------------
<aca se espera a completar el tiempo de espera segun fps antes de pasar al siguiente frame>



la prioridad se respeta

espero se haya entendido.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2