Tengo problemas de funciones no reconocidas

Started by FreeYourMind, July 30, 2009, 06:54:59 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

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

FreeYourMind

Hice pruebas con distintos valores de FRAME, el minimo para que aparezca en la Gp2x Wiz (en el PC sale siempre), fue FRAME(400).
El Loading tarda 7 segundos sin poner el texto, con texto son 8 segundos.

Otro problema que tengo, ya que tengo la conversión al 90% y dentro de una semana saco el juego, son solo 2 cosas:

1 - El fade in y fade on parece que no funcionan.

2 - El rendimiento se me ve afectado teniendo varias animaciones en simultaneo, lo curioso es que teniendo muchos procesos no se ve minimamente afectado (en fenix esto era un problema), pero con varias animaciones (por ejemplo 20 cuadrados animados de 8x8 pixels, con 7 o 8 animaciones cada) al igual que fenix pierde mucho rendimiento.
Lo peor es que se queda lento, y despues al terminar procesos se acelera y queda super rápido, más de lo definido, ya que pongo 24 frames por segundo, y en los casos que esta ralentizado debido a estas animaciones, cuando libero otros procesos y queda mas rapido, para estabilizarse, es como consumiera los frames que quedan, quedando mas rápido que los 24 frames definidos, y lo ideal es que no los ultrapasara nunca. Resumiendo,  con esto me veo con el problema de que en ocasiones (despues de ultrapasar tiempos de ralentización), todo el juego se me queda mas rápido de lo que quiero (24 frames/segundo).


SplinterGU

no te entendi mucho... ejemplos y codigos serian ideales para ver el tema...

el fade se comporta un poco diferente que las viejas versiones de fenix... no se como lo estas haciendo, pero funcionar, funciona.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Utilizo el sencillo fade_off(); seguido de fade_on();  Cual seria el equivalente ??

Sobre la velocidad, es lo siguiente, tengo una pantalla que tiene muchos bloques y cada uno es un proceso (la pantalla se rellena de estos cuadrados o bloques), y tengo otros bloques que tambien son procesos pero estos son animados y estos estan siempre en pantalla (no desaparecen nunca).

En total son como 180 bloques en la fase, de los cuales 20 son animados y estan hasta el final, y los otros van desapareciendo a medida que con el jugador choco contra ellos.
en esta pantalla inicialmente va juy lento el juego, pero como al colidir con estos bloques (los que no son animados) estos son destruidos, lo que hace que el juego gane rendimiento y se acerque a su velocidad normal (24 frames por segundo), lo que ocurre es que en lugar de estar lento y normalizarse a hasta los 24 frames, no ocurre, se vuelve mas rápido al destruir estos bloques (procesos) pero la velocidad sube por encima de los 24 frames, solo pasando unos segundos se normaliza, pero termina por existir intermedios de tiempo que va mas rapido que los 24 frames.
Es como si en el instante que va mas rapido estuvira 'consumiendo' los frames que al principio no consumio (cuando el juego estaba lento, porque tenia todas las animaciones y todos los procedimientos), cuando no llegaba a los 24 frames.


SplinterGU

que version de bennu estas usando? la r99 + el patch r100?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2


SplinterGU

voy a tener que seguir mejorando el sistema de control de fps parece...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

#37
No se como tendras el sistema de control de fps, pero creo que lo unico que te falta es una condición para que no ultrapase el fps definido inicialmente cuando haces la supuesta optimización.

Yo lo voy a intentar optimizar substituyendo el conjunto de procesos de los cubos animados por 1 que tenga todos los cubos en una imagen animada.
Creo que esto me va a solucionar el problema.

Sobre los fade off y fade on,
Utilizo el sencillo fade_off(); seguido de fade_on();  Cual seria el equivalente ??

Esto para terminar mi mesa de ayuda e intentar sacar el juego ya este fin de semana, para ponerme con otro port.

FreeYourMind

Quote from: SplinterGU on August 17, 2009, 01:31:06 AM
voy a tener que seguir mejorando el sistema de control de fps parece...

Pongo lo mismo que puse en el foro gp32spain, ya que tiene que ver con el mismo tema:


1-


Ya he probado la r101 para Wiz:

El tema del fps sigue igual, o sea, tengo definido fps 24 frames, si el juego va lento (solo en fases con muchas animaciones), al destruir procesos, y antes de estabilizarse a su velocidad normal (24 frames, como en las fases sin animaciones donde va bien desde el principio al final), se pasa del fps 24 frames a velocidades mayores, solo pasados unos segundos se estabiliza.

Aunque me ha dado la sensacion que solo queda mas rapido (+24 frames fps) mas tarde ya cuando quedan muy pocos procesos por destruir, y con la r100 se vuelve antes mas rapido cuando hay mas procesos en pantalla.
Esto fue solo una sencación al probarlo, no se si sera verdad, habria que compararlo mas detalladamente.

Ahora se me ocurre, se puede imprimir el valor que tenga de fps en pantalla ? con esto no me refiero al valor que yo defina, ya que es de 24 fps, pero si al que en realidad bennu estaria ejecutando en su instante ?

Otra diferencia es que me ocupa 1kb más el dcb  (sera por el nuevo código)

Y otra cosa, probe tal como dices el compilado del r100 en el interprete r101 en windows y como dices no son compatibles, lo guapo seria en el interprete te avisara de esto en un mensaje en lugar de dejar de responder  (es solo una observación, para nada te quiero obligar a picar código )


2 -

Cita (del foro gp32spain):
Originalmente Escrito por Drumpi 
Fade_on y fade_off crean el fundido pero de forma muy rápida. Lo he puesto en el código para "apagar" la pantalla antes de hacer el efecto del fade.
Lo suyo es usar fade(r,g,b,paso) en el que r,g,b son las componentes de color en porcentajes (si pones 100,100,100 se encenderá la pantalla, si pones 0,0,0 se apagará, si pones 100,0,0 sólo se encenderán las componentes rojas de los colores, si pones 200,0,0 hará un fundido a rojo, si pones 200,200,200 hará un fundido a blanco...).
Y paso es la velocidad del fundido, aunque no recuerdo si es directa o inversamente proporcional.



He probado poniendo:


fade_off();
frame;
fade_on();
while (fading) frame; end

pero no noto el efecto del fade como en Fenix.

Si mi duda es saber que poner (si puedes ponme el codigo correcto)
para ser lo más identico a fenix (me refiero tambien a la velocidad de fundido por si tengo que usar fade(r,g,b,paso)).

En los 2 casos te agradeceria que cambiaras el siguiente ejemplo de FENIX para que funcionara igual en BENNU:

PROCESS menuopciones()
PRIVATE
...

BEGIN
let_me_alone();

...

IF (salir_opciones)
fade_off();
unload_song(musica);
delete_text(all_text);
clear_screen();
fade_on();
menu(); // salimos al menu
END
FRAME(200);
END


Gracias.
Lo quiero sacar este fin de, sobre el fps, tengo otra forma de que no queden lentas las fases debido a tanta animacion (voy a poner todas las animaciones en solo una a ver si gana rendimiento), y no tendre que preocuparme que en bennu se arregle el tema para ahora y sacare ya el juego.
Sobre el fade_on, fade_off es una cosa pequeñita, pero es lo que falta para terminar :)

splinter_work

#39
aca te paso el ejemplo:


import "mod_video";
import "mod_map";
import "mod_key";

begin
   set_fps(15,0);

   map_clear(0,0,rgb(255,0,0));

   while(!key(_ESC))
       if ( key(_1) ) fade_off(); while(fading) frame; end; end
       if ( key(_2) ) fade_on(); while(fading) frame; end; end
       frame;
   end

end


obviamente que si ya la pantalla esta encendida, con hacer fade_on no va a pasar nada... fenix, aunque la pantalla este encendida la ponia en negro y luego al encendia... lo mismo aplica a fade_off

quizas el fade_on y fade_off van muy rapido (para mi gusto, debo ajustarlos un poco o permitir cambiar el paso), prueba con esto que te va a ir mejor.


import "mod_video";
import "mod_map";
import "mod_key";

begin
    map_clear(0,0,rgb(255,0,0));

    while(!key(_ESC))
        if ( key(_1) ) fade(0,0,0,1); while(fading) frame; end; end
        if ( key(_2) ) fade(100,100,100,1); while(fading) frame; end; end
        frame;
    end

end

FreeYourMind

Bueno ya habia visto en el otro foro, aca (aca latino hehehe me gusta :)) dejo mi respuesta del otro foro, ya que es en este que deberia estar, pues puede que alguien necesite nuestras discusiones y soluciones:


1 - Mil gracias mañana pruebo lo del fps.

2 - Acababa de encontrar la solucion sobre el fade_off, fade_on.

Para tener el efecto similiar de Fenix donde poniendo:

fade_off();
fade_on();

en qualquier parte, hace un apagado y encendido de la pantalla muy rapido, sin tener que definir nada más, ni frame; ni nada.

Pues en Bennu tambien funciona, lo que ocurre (por las pruebas que hice) es que el segundo fade anula el primero, y como es de encendido pues la pantalla sigue igual.

Hay que hacer esto (seria lo equivalente, a velocidad de fade similar, para mis ojos vamos, no que sea exactamente la misma velocidad ):

fade_off();
while (fading) frame(30);end
fade_on();

y ya esta, esto hace el mismo efecto a identica velocidad, la cual se cambia en el frame, pero tambien podemos hacer esto:

fade(0, 0, 0, 100); // 100 es la velocidad, mas alto más rápido
while (fading) frame;end
fade_on(100, 100, 100, 3);

Aunque lo sabes de sobra hehehhe  pero por lo menos ya tenemos la solucion exacta, es poner

while (fading) frame(30);end

despues del primer fade y ya esta.

SplinterGU

claro, lo que pasa es que en fenix, la funcion era bloqueante... o sea, que nada se volvia a ejecutar hasta que fade_on/fade_off, de la forma que bennu lo hace, podrias aprovechar el tiempo muerto para hacer otras cosas... o incluso hacer un fade mientras objetos por detras se mueven o lo que sea...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Te vas alegrar aun mas con esto:



Acabo de resolver el otro Bug, el del FPS que tiene Bennu, de modo en que en el juego no ocurra:



- Resumen del bug:



Bug 1 - En un instante del programa que exista ralentización (fps por debajo del asignado), al eliminar procesos durante la ejecución del programa, hay instantes en que el valor del fps sube debido al incremento de rendimiento (por la lógica de eliminacion de procesos), pero este valor en estos instantes sube por encima del fps inicialmente asignado en el programa y solo pasado unos instantes se estabiliza en el valor inicialmente asignado. Lo correcto seria pasar de ralentización (fps por debajo) al fps correcto (fps asignado) al eliminar procesos, y en ningun caso ultrapasar este valor.





Solución:



Buscando la solución me deparo con otro Bug, y tomando partido de este nuevo Bug encuentro la solución (interesante esto) :)



Nuevo Bug:



Bug 2 - Solo se obtiene el real valor del fps durante la ejecución de un programa

con



write_int(0, 30, 0, 0, &fps); // FPS





si definimos el fps con



set_fps (0, 0); 



(que pone el fps al maximo posible en todo instante)





teniendo esto, pues solo puedes tirar partido de la variable del sistema 'fps' si utilizas

set_fps (0, 0);



si la defines con otro valor, la variable 'fps' de Bennu no va ser correcta en algunos momentos del programa.



Mi impresion es que el problema en Bennu proviene de que utilizando set_fps(0,0) la variable 'fps' se esta actualizando en tiempo real por eso tenemos siempre el valor correcto, y poniendo por ejemplo set_fps(24, 0) esta variable 'fps' deja de actualizarse y su valor no es correcto (ya que el fps cambia segun el rendimiento del programa pero este valor se mantiene, yo tenia instantes en que el juego iba a 7 frames/seg y el valor de esta variable seguia indicando los 23/24 frames :)).





La solución que encontre fue la siguiente:





1 - Defino el valor de fps con una variable global (lo pongo asi porque en las opciones tb se puede cambiar la velocidad del juego)



GLOBAL

velocidad = 24;





2 - Inicio la fase (solo el fps de las fases, o sea la 'velocidad', es configurable en las opciones)

con



set_fps (0, 0);



Esto me permite obtener el valor de la variable de Bennu 'fps' (real) en tiempo de ejecución y debido al bug anterior (bug 2), es la unica forma, si pongo por ejemplo set_fps(velocidad, 0); esta variable 'fps' no va ser correcta durante la ejecución y no me sirve.





3 - Durante el loop del programa (fase) ponemos la condicion clave, ya que es la que soluciona el Bug 1:



IF(fps >= velocidad)  set_fps (velocidad,  0); END



Con esto evito (por fin) que el juego ultrapase el fps inicialmente estabelecido (velocidad=24 o el valor que le asignemos en las opciones) en los momentos que sale de una ralentización (ver Bug 1).



Como nota, en este instante al definir set_fps (velocidade, 0);

volvemos a tener el Bug 2 :) en que el valor del sistema Bennu 'fps' ya puede no ser correcta, pero como ya tenemos el Bug 1 resuelto, en este instante y hasta el fin de la fase ya no necesito utilizar la variavle 'fps' (en este caso, debido a la estrutura de la fase ya que no volvemos a perder rendimiento hasta pasar de fase, en otros casos podria ser un problema de nuevo).





4 - Por fin, al pasar de fase volvemos a definir



set_fps(0, 0);



para poder volver a repetir el todo el proceso en la fase siguiente :)





Son estas cosillas (chorraditas) que nos animan :)





P.S: Por cierto no puedo usar el frameskip, por ejemplo set_fps(velocidad, 3); porque este tipo de juego se vuelve injugable si salto frames (ya que chocamos contra obstaculos sin querer).

SplinterGU

eso lamentablemente no es una solucion y tiene sus problemas...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2