Foro de elhacker.net

Programación => Java => Mensaje iniciado por: 3n31ch en 21 Enero 2015, 22:58 pm



Título: [Resuelto] FPS videojuegos, y System.nanoTime()
Publicado por: 3n31ch en 21 Enero 2015, 22:58 pm
Hola gente, verán esta duda me surgió a raíz de ver algunos códigos por Internet. Antes aclarar entiendo que son los FPS, y se que "podría regularlos" utilizando:

Código
  1. Thread.sleep(1000/fps);

Pero no creo que eso sea correcto, ya que seria como obligar a que se repinte a una velocidad que quizas no sea posible para el sistema, buscando códigos y eso me encontré con la utilización de:

Código
  1. System.nanoTime();

Pero no se muy bien de que trata este método específicamente, se que tiene relación con el tiempo y todo pero cual seria su uso en el tema de los FPS?

Este seria el código de forma resumida, las variables son numéricas (long o int)

Código
  1. fps= 60;
  2. targetTime = 1000 / fps;
  3.  
  4. while(running){
  5.     start = System.nanoTime();
  6.     //argumento, update() y esas cosas
  7.     elapsed = System.nanoTime() - start;
  8.     wait = targetTime - elapsed / 1000000
  9.     Thread.sleep(wait);
  10. }

PD: Ya busque por google y ya leí la API


Título: Re: [PREGUNTA] FPS videojuegos, y System.nanoTime()
Publicado por: 3n31ch en 22 Enero 2015, 02:45 am
He releído y releído el código, y creo que llegue a una solución al problema si por alguien le interesa, (esta solución la concluí por mera lógica no por la funcionalidad real de System.nanoTime()) Espero que si alguien tiene la respuesta real, confirme o niegue lo que pasteare acá.

Código
  1. fps= 60; // Declaro los FPS esperados
  2. targetTime = 1000 / fps; // Al dividir los fps por 1000 obtendré el tiempo necesario de espera por cada repintado sin tener en cuenta el tiempo que se demora en repintar.
  3.  
  4. while(running){
  5.     start = System.nanoTime(); // obtengo el momento en el que el juego empieza a actualizar el cuadro
  6.     //argumento, update() y esas cosas
  7.     elapsed = System.nanoTime() - start; // obtengo el momento en que el juego termina de actualizar el cuadro
  8.     wait = targetTime - elapsed / 1000000 // dividiendo elapsed por 1000000 igualo el tiempo de nanosegundos a milisegundos, luego lo resto a targetTime para obtener el tiempo real de FPS
  9.     Thread.sleep(wait);
  10. }
  11.  

Si alguien entiende de esto podria confirmar mi deduccion? aunque supongo que estoy en lo correcto. y que System.nanoTime() es utilizado para tener el tiempo que se demora el programa en realizar X tareas, retando el punto de fin al punto de inicio.


Título: Re: [Resuelto] FPS videojuegos, y System.nanoTime()
Publicado por: Maurice_Lupin en 30 Enero 2015, 18:05 pm
Se entiende que duermes mientras sobra tiempo  ;D

Lo que tocaria es probar tu código en un juego simple, en distintas pcs una antigua y otra actual, deberia correr a la misma velocidad.

Saludos.


Título: Re: [Resuelto] FPS videojuegos, y System.nanoTime()
Publicado por: 3n31ch en 30 Enero 2015, 18:07 pm
No le veo el caso, es lógico. XD, simplemente me complique buscando info sobre como hacia las cosas System.nanoTime().

gracias por la respuesta y por cierto no entendí lo que dijiste

Se entiende que duermes mientras sobra tiempo  ;D


Título: Re: [Resuelto] FPS videojuegos, y System.nanoTime()
Publicado por: Maurice_Lupin en 3 Febrero 2015, 15:08 pm
Es lo que hace tu codigo, cálcula cuanto tiempo falta para refrescar el juego, según los FPS, y se duerma si hay tiempo  ;D

Seria bueno postear un ejemplo básico sobre el tema.

Saludos.