FPS Dinamicos en BennuGD

Started by JaViS, August 26, 2018, 04:35:35 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

JaViS

nada, no me aguanto y tenia que compartirlo ya con uds porque estoy RE emocionado.


El otro día en la ducha tuve una iluminacion y me puse como idiota a anotar todo en papel antes de que se me olvide, y este fin de semana pude implementarlo.


Estaba pensando en lo choto que es tener que setear FPS fijos en Bennu para nuestros juegos, porque tiene dos desventajas grandes. En maquinas lerdas, los juegos se alerdan, lo que nos obliga a usar FPS bajos, pero  no podemos aprovechar la potencia de las maquinas grandes que pueden mostrar mas. Sin decir lo feo que se ven los juegos a 25/30 FPS. Este es un problema que tenemos en Anarkade, ya que al ser un juego competitivo, necesitamos que se vea lo mas fluido posible.


Bueno, como les decía, me estaba duchando mientras pensaba en esto, y se me ocurrió que de la misma forma que 3D Studio te calculaba los frames intermedios de una animacion, y nosotros solo necesitamos definir los Key Frames, podemos considerar los frames de nuestro juego como Key Frames, y tener una funcion en bennu que nos calcule cuantos frames intermedios la maquina puede agregar, y renderizarlos!


Y bueno acabo de implementarlo en anarkade y va de lujo!! pronto mas noticias!
Working on Anarkade. A couch multiplayer 2D shooter.

panreyes

Muchas ganas de verlo en acción Javis, suena mágico :)

A los demás: Le comenté por Twitter si era algo parecido al delta time de Unity, pero me ha dicho que no es necesario modificar el juego, simplemente una función que se encargará de hacer las interpolaciones...

JaViS

exactamente, estoy preparando el código ahora para compartirlo, quiero hacerlo hoy porque en la semana se complica por el trabajo.


Pronto mas novedades!
Working on Anarkade. A couch multiplayer 2D shooter.

JaViS

Bueno, acabo de subirlo al Repo: https://bitbucket.org/pixelatom/bennu_framework/src/11b35d5cc5a2a90a7bff81b22ad0783810ff325b/library/dynamic_fps.inc?at=master&fileviewer=file-view-default


se usa así:

* se bajan el framework (ponen la carpeta library afuera de la de su juego)
* incluyen include "../library/dynamic_fps.inc";
* reemplazan set_fps() con dynamic_fps()




//set_fps(30,0); // vamos a usar frames dinamicos! :D
dynamic_fps(30);



Eso es todo!! :D

Consideraciones:

* esta en desarrollo y hay cosas por resolver y tunear
* dynamic_fps es un proceso, se puede matar con señales FORCE o con let_me_alone(), asi que si usan este ultimo, recomiendo usar signal(ALL_PROCESS ,S_KILL); en su lugar
* avisen como les va!
Working on Anarkade. A couch multiplayer 2D shooter.

panreyes

Impresionante :|

Lo he probado con el propio eXplosive Dinosaurs (sobre PixTudio y aceleración GPU), que es un proyecto bastante gordo y que podría dar infinitos problemas, y he podido comprobar que funciona a la más absoluta perfección! :O

Lo único que he tenido que hacer es limitar el número máximo de FPS, ya que se iba a 3000 y dynamic_fps no funcionaba como debería.

Y ya digo que es notable, no es simplemente el numerito de FPS: lo he probado en un monitor de 144hz y se ve una mejora en la fluidez de los movimientos.

¡Alucinante! :D Enhorabuena, ¡gran trabajo!


JaViS

Si, me imagino que hay algún bug que otro, he subido todo muy rapido sin probar bien jaja, ahora toca revisar tranquilo!
Working on Anarkade. A couch multiplayer 2D shooter.

Arcontus

No entendí nada xD, conozco 3ds y he releido el post 2 veces pero sigo sin entender a la práctica para que sirve. Un ejemplo sería de agradecer :D
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

JaViS

Ok! En la semana voy a subir un ejemplo más evidente, después de solucionar un par de detalles que me quedan. :)
Working on Anarkade. A couch multiplayer 2D shooter.

panreyes

Quote from: Arcontus on August 26, 2018, 09:04:09 PM
No entendí nada xD, conozco 3ds y he releido el post 2 veces pero sigo sin entender a la práctica para que sirve. Un ejemplo sería de agradecer :D

Yo te explico. Olvida 3ds, planteamos un ejemplo de un juego en Bennu:
Tienes un personaje en pantalla que si pulsas las flechas se mueve 10 píxeles por imagen a 30fps, 300 píxeles por segundo.
Si cambiases el set_fps de 30 a 60fps, la velocidad del movimiento sería 600 píxeles por segundo y avanzaría mucho más rápido, ¿no?

Pues con esta función, y sin cambiar nada más del código, podrás hacer que el juego funcione a 60 imágenes por segundo sin avanzar mucho más rápidamente.
Lo que hace esta función es guardar información sobre la posición anterior del proceso, la posición actual y añade un frame interpolado.

Dicho de otra forma que se entenderá mejor: el personaje se moverá 5 píxeles por imagen a 60fps, 300 píxeles por segundo, sin que tú tengas que modificar tu código porque la función de dynamic_fps se encarga de hacer ese intervalo automáticamente (sólo a efectos de visualización, eso sí).

JaViS

#9
Acabo de subir un ejemplo en donde se ve muy evidente el efecto del dynamic_fps:


Tan solo clonen el repositorio y prueben el siguiente archivo: https://bitbucket.org/pixelatom/bennu_framework/src/5d4592efeb2fc55e20543525d697748d28a7be16/test_hardness/basics.prg?at=master&fileviewer=file-view-default


Como veran, el ejemplo está diseñado para andar a 5 FPS, pero tiene comentado set_fps:


//set_fps(5,0);   
dynamic_fps(5);



si descomentan set_fps y comentan dynamic_fps, van a ver como tiene que andar el juego originalmente con frames fijos, y van a ver como funcionan los frames intermedios agregados por la libreria


:) cuentenme que les parece!




Edit: de paso le dan una ojeada al motor de durezas que usamos en anarkade ;)
Working on Anarkade. A couch multiplayer 2D shooter.

panreyes

Holas :)

Yo también he hecho un ejemplo:
https://www.dropbox.com/sh/exzfn7w7hkaz2ml/AABfSFWQ8xaeQDKEz5fNCMQra?dl=0

Vídeo en funcionamiento: https://youtu.be/MHFl3MHOsbw

Un nave programada a 5fps, interpolada a 60fps :)
Este es el código:

include "..\..\common-src\fenix.h";
include "../library/dynamic_fps.inc";

Private
id_txt;
Begin
full_screen=1;
set_mode(1280,720);
fpg_load("general.fpg");
set_fps(5,0);
write(0,0,40,0,"Press SPACE to change between SET_FPS and DYNAMIC_FPS.");
id_txt=write(0,0,80,0,"SET_FPS");
write_int(0,0,0,0,&fps);
loop
if(not exists(type texto)) texto(); end
if(key(_space))
delete_text(id_txt);
if(id_dynamic_fps==0)
dynamic_fps(5,60);
id_txt=write(0,0,80,0,"DYNAMIC_FPS");
else
id_dynamic_fps=0;
set_fps(5,0);
id_txt=write(0,0,80,0,"SET_FPS");
end
while(key(_space)) frame; end
end
frame;
end
End

Process texto();
Begin
graph=1;
y=300;
angle=-90000;
while(x<1100) x+=60; frame; end
End

JaViS

Genial! Ese ejemplo es mucho más simple! Gracias!
Working on Anarkade. A couch multiplayer 2D shooter.

Arcontus

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

no veo el sentido, es lo mismo que usar skip, solo que consume mas proceso de la VM, hay mas logica, y esa logica demora un poco mas... y no solo eso, sino que el motor interamente no solo tiene en cuenta cuando la CPU va mas rapido, sino que tambien cuando la CPU no le da y va mas lento... con set_fps(0,0), vas a dibujar todos los frames, con skip, salta frames cuando no alcanza.

perdon por ser pesimista.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

quiero aclarar, skip en el set_fps, no obliga a skipear frames, sino es el valor maximo que frames que puede skipear... si no necesita skipear no skipea.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2