Single Tech Games

Capitulo 2. An Animation Framework – parte 3

Bueno ha pasado mas de 1 semana desde mi ultimo post, y es que he tenido bastantes cosas que hacer, pero lo bueno ha sido que tuve una clases dictada por una empresa colombiana dedicada al desarrollo de juegos, The Ethereal Game Factory , donde aprendí hacer el juego pong con Java ME, con un poco de tiempo lo podre subir al blog y explicar un poco de como usar el framework para celulares de java.

5. FPS and Sleeping for Varying Times


Una debilidad en el bucle de animación, es la velocidad, por ejemplo en una maquina lenta un bucle se ejecuta 20 veces en un segundo pero en una maquina rápida serán 80 veces, siendo 4 veces más rápido y a veces injugable.
Ahora, recuerdan que les explique sobre FPS, bueno ahora se los explicaré un poco mejor, un frame es una iteración del bucle de animación, es decir, una vez que pasa por las funciones de renderizado, actualización y siesta, es decir, si queremos que nuestro juego corra a100fps cada iteración del bucle debería tomar 1000/100 = 10ms (1000 = 1 segundo), el tiempo que tome la iteración deberá ser guardado en la variable “period”.

public void run()
/* actualiza, renderiza y duerme constantemente*/
{
/* Reptidamente: actualiza,renderiza, duerme, */
    long beforeTime, timeDiff, sleepTime;
    beforeTime = System.currentTimeMillis();
    running = true;
    while(running) {
        gameUpdate(); // Actualiza el estado del juego
        gameRender(); // renderiza en un buffer
        paintScreen(); // dibuja el buffer en la pantalla
        timeDiff = System.currentTimeMillis() - beforeTime;
        sleepTime = period - timeDiff; // timepo que deberia faltar en el bucle
        if (sleepTime <= 0) // si actualizar/renderizar toma mas de lo que deberia
            sleepTime = 5; // igual duerme un ratito
        try {
            Thread.sleep(sleepTime); // en ms
        }
        catch(InterruptedException ex){}
            beforeTime = System.currentTimeMillis();
    }
    System.exit(0); // cierra JFrame o JApplet si existen
} // fin de run()

5.1. Timer Resolution

también llamado Granularidad, es la cantidad de tiempo que debería separar a 2 temporarizadores, es decir ¿cuanto daria la resta de 2 variables con información de  System.currentTimeMillis() ?
Bueno el valor de esta resta depende del sistema operativo (the resolution of the standard clock interrupt), por ejemplo en windows 95/98 la resolución es de 55 ms lo que significa que los valores de System.currentTimeMillis() cambiaran cada 55ms, y esto, en un bucle de animación significa que va a correr más lento de lo esperado, por ejemplo imaginemos que un bucle de animación toma menos de 55 ms, que hacemos después? ¿esperamos a que termine el bucle? Bueno eso daría como resultado que el juego tenga que parar un momento dando sensación de lentitud.
¿Que hacemos al respecto? Bueno tendremos que ver la forma de hacer demorar a nuestro bucle mas 55ms pero lo que daría como resultado un FPS de 18, un numero bastante inadecuado para un juego.
Este problema no se percibe a partir de las versiones de windows NT en adelante, tampoco en macintosh, ni en linux, ya que System.currentTimeMillis() en XP toma de 10-15ms, haciendo posible obtener entre 67-100 FPS, en Linux y la MAC OS X el temporarizador es cada 1ms, lo que es perfecto para un juego

5.2. What is a good FPS?

En mis posts de Invaders explique de una forma bastante entendible lo que es FPS, pero acá toma una versión mas teórica, según el libro:
El limite inferior es dictado por el ojo humano, y el critical flicker frequency (CFF), y esto es la frecuencia de una fuente luminosa fluctuante a la cual se la ve como contínua, debido a que los elementos fotoconversores (fisiológicos), no tienen tiempo para seguir el ciclo de frecuencia. En TV, esta frecuancia es de 50 Hz. A menos frecuencia el ojo percibiría un efecto extraño en la imagen, denominado efecto Flicker ó de parpadeo, es este efecto Flicker el que queremos evitar en los juegos, como antes les enseñe, un monitor va entre 70-90 hz (70-90 FPS) y no hay razón alguna para enviar mas FPS a la tarjeta de video, porque no van a ser mostradas, en cambio consumimos mas recursos de CPU

5.3. Are We Done Yet?

Bueno este librito hace hincapié en los problemas de windows 98 en esta parte, pero, obviamente, windows 98 ya no es un SO a considerar sino chequea lo que dice Google y eso que es del 2004, imagínense ahora en el 2008…

5.4. Improved Standard Java Timers and Counters

Mencionan algunos problemas de los java timers, pero que son solucionados por J2SE 1.5 (codenamed ‘Tiger’), osea que ya estamos en el 1.6 por ahora así que no se preocupen ^_^

5.5. High Performance Counters – 6.1. Handling Sleep Inaccuracies

Estas partes tratan sobre Java 3D, por favor recuerden que este blog tratara solo y exclusivamente de Java 2D y hacer un juego en 2D, a mi ni siquiera me gusta mucho jugar en 3D xD, si uds gustan pueden leerlo, yo salteare esa parte y seguiré en mi siguiente post con la parte 7
Nos vemos

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments