[Resuelto] FPS videojuegos, y System.nanoTime()

Iniciado por 3n31ch, 21 Enero 2015, 22:58 PM

0 Miembros y 1 Visitante están viendo este tema.

3n31ch

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 (java) [Seleccionar]
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 (java) [Seleccionar]
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 (java) [Seleccionar]
fps= 60;
targetTime = 1000 / fps;

while(running){
    start = System.nanoTime();
    //argumento, update() y esas cosas
    elapsed = System.nanoTime() - start;
    wait = targetTime - elapsed / 1000000
    Thread.sleep(wait);
}


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

3n31ch

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 (java) [Seleccionar]

fps= 60; // Declaro los FPS esperados
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.

while(running){
    start = System.nanoTime(); // obtengo el momento en el que el juego empieza a actualizar el cuadro
    //argumento, update() y esas cosas
    elapsed = System.nanoTime() - start; // obtengo el momento en que el juego termina de actualizar el cuadro
    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
    Thread.sleep(wait);
}


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.

Maurice_Lupin

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.
Un error se comete al equivocarse.

3n31ch

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

Cita de: Maurice_Lupin en 30 Enero 2015, 18:05 PM
Se entiende que duermes mientras sobra tiempo  ;D

Maurice_Lupin

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.
Un error se comete al equivocarse.