Autor Tema: FPS Dinamicos en BennuGD  (Leído 657 veces)

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
FPS Dinamicos en BennuGD
« en: Agosto 26, 2018, 04:35:35 pm »
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

  • Administrator
  • *****
  • Mensajes: 2154
  • Karma: 74
    • panreyes.com
Re:FPS Dinamicos en BennuGD
« Respuesta #1 en: Agosto 26, 2018, 05:53:13 pm »
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

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
Re:FPS Dinamicos en BennuGD
« Respuesta #2 en: Agosto 26, 2018, 06:10:34 pm »
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

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
Re:FPS Dinamicos en BennuGD
« Respuesta #3 en: Agosto 26, 2018, 07:54:01 pm »
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()


Código: [Seleccionar]

//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

  • Administrator
  • *****
  • Mensajes: 2154
  • Karma: 74
    • panreyes.com
Re:FPS Dinamicos en BennuGD
« Respuesta #4 en: Agosto 26, 2018, 08:43:09 pm »
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

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
Re:FPS Dinamicos en BennuGD
« Respuesta #5 en: Agosto 26, 2018, 08:55:29 pm »
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

  • Sr. Member
  • ****
  • Mensajes: 278
  • Karma: 9
Re:FPS Dinamicos en BennuGD
« Respuesta #6 en: Agosto 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

JaViS

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
Re:FPS Dinamicos en BennuGD
« Respuesta #7 en: Agosto 26, 2018, 10:22:21 pm »
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

  • Administrator
  • *****
  • Mensajes: 2154
  • Karma: 74
    • panreyes.com
Re:FPS Dinamicos en BennuGD
« Respuesta #8 en: Agosto 26, 2018, 10:35:23 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

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
Re:FPS Dinamicos en BennuGD
« Respuesta #9 en: Agosto 29, 2018, 09:51:32 pm »
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:

Código: [Seleccionar]
//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 ;)
« última modificación: Agosto 29, 2018, 10:05:17 pm por JaViS »
Working on Anarkade. A couch multiplayer 2D shooter.

panreyes

  • Administrator
  • *****
  • Mensajes: 2154
  • Karma: 74
    • panreyes.com
Re:FPS Dinamicos en BennuGD
« Respuesta #10 en: Agosto 30, 2018, 01:02:03 am »
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:
Código: [Seleccionar]
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

  • Global Moderator
  • *****
  • Mensajes: 1252
  • Karma: 26
    • Anarkade
Re:FPS Dinamicos en BennuGD
« Respuesta #11 en: Agosto 30, 2018, 01:47:34 am »
Genial! Ese ejemplo es mucho más simple! Gracias!
Working on Anarkade. A couch multiplayer 2D shooter.

Arcontus

  • Sr. Member
  • ****
  • Mensajes: 278
  • Karma: 9
Re:FPS Dinamicos en BennuGD
« Respuesta #12 en: Agosto 30, 2018, 01:14:00 pm »
¡¡Es una pasada!!

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12758
  • Karma: 375
Re:FPS Dinamicos en BennuGD
« Respuesta #13 en: Agosto 31, 2018, 01:44:26 am »
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

  • Hero Member
  • *****
  • Mensajes: 12758
  • Karma: 375
Re:FPS Dinamicos en BennuGD
« Respuesta #14 en: Agosto 31, 2018, 01:45:44 am »
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