Limite el procesamiento del sorteo en un bucle de juego

Estoy usando esta estructura de código a continuación desde aquí http://www.koonsolo.com/news/dewitters-gameloop/ para establecer un bucle de juego que se procesa en función de un conjunto de fps pero renderiza / dibuja lo más posible. ¿Cómo se implementaría una tapa en el dibujo fps para no usar toda la potencia de procesamiento / duración de la batería? o para limitarlo para la sincronización v.

const int TICKS_PER_SECOND = 60;
const int SKIP_TICKS = 1000000000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 5;

DWORD next_game_tick = GetTickCount();
int loops;
float interpolation;

bool game_is_running = true;
while( game_is_running ) {

    loops = 0;
    while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
        update_game();

        next_game_tick += SKIP_TICKS;
        loops++;
    }

    interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                    / float( SKIP_TICKS );
    display_game( interpolation );
}
Respuesta 1

¿Supongo que realmente estás haciendo una interpolación de movimiento adecuada? De lo contrario, no tiene sentido renderizar más rápido que la actualización del juego: solo volverás a renderizar todos los objetos exactamente en la misma posición.

Sugeriría lo siguiente:

  • Realice una Thread.sleep(millis)llamada para detener el bucle ocupado. Probablemente a Thread.sleep(5)esté bien, ya que solo va a hacer una verificación rápida para saber si está listo para la próxima actualización.
  • Realice una prueba condicional en la display_gamellamada para ver si ha transcurrido al menos un cierto número de milisgundos desde el último display_game. Por ejemplo, si realiza estos 10 ms, su velocidad de fotogramas se limitará a 100 FP.

También hay un par de otras cosas que no están claras en su código:

  • ¿Qué es DWORD? ¿Es esto realmente Java? Parece una divertida conversión C / C ++? La forma normal de obtener la hora actual en Java sería long time=System.nanoTime()o similar .....
  • ¿Qué marco gráfico estás usando? Si es Swing, entonces debe tener cuidado con el hilo en el que se está ejecutando, ya que no desea bloquear el hilo de la GUI ...

Finalmente, también debe considerar si desea desacoplar su ciclo de actualización del código de representación y hacer que se ejecuten en diferentes hilos. Es más difícil hacerlo bien, ya que es posible que deba bloquear o tomar instantáneas de ciertos objetos para asegurarse de que no cambien mientras los renderiza, pero ayudará a su rendimiento y escalabilidad en máquinas de múltiples núcleos (que es la mayoría de ellos ¡hoy en día!)

Respuesta: 2

Uso de enlaces Selenium Java. Estoy tratando de escribir un módulo corto que tomará una captura de pantalla completa de una página del navegador (sé que AShot existe pero no se mantiene y tiene algunos problemas para mí). Como ...

Acerca de cómo nombrar una clase cómo Helper o Utils se explica claramente en: ¿Cuáles son las diferencias entre las clases Helper y Utility? Tal como: XHelper o XUtils. Hice una investigación y obtuve ...

Tengo este código aquí, es un botón que llama a otro jFrame para editar cosas, las cosas van a una jTable que necesita la entrada del usuario para actualizarse. Quiero hacer esta actualización automática, colocando la misma ...

He construido un árbol extendido y estoy tratando de imprimirlo en orden inverso para que cuando gire la cabeza hacia la izquierda pueda ver el árbol de manera normal. He escrito el siguiente código y ...