Tartamudeo del bucle del juego

Soy un principiante en Java. Traté de crear un programa simple con Swing donde muchas bolas rebotan. El programa se estaba ejecutando bien, suave 60 fps y sin tartamudeo. Sin embargo, la CPU estaba funcionando constantemente al 20%. Más tarde leí en alguna parte que puedo limitar el uso de la CPU agregando el método Thread.sleep al final del ciclo. Sin embargo, si hago eso, el programa a veces tartamudea. No tengo idea de por qué, no cambié nada más. No siempre tartamudea, a veces no tartamudea en absoluto, incluso si estoy ejecutando el programa durante mucho tiempo. Pero a veces comienza a tartamudear tan pronto como abro el programa. Además, cuando tartamudea, FPS sigue mostrando 60. Entonces, ¿hay algo que hice mal?

Este es el ciclo del juego:

    long currentTime;
    long lastTime = System.nanoTime();
    int targetFps = 60;
    int timePerTick = 1000000000 / targetFps;
    long delta = 0;
    long fpsTimer = 0;
    int fpsCounter = 0;

    while(running) {
        currentTime = System.nanoTime();
        delta += currentTime - lastTime;
        fpsTimer += currentTime - lastTime;
        lastTime = currentTime;
        if(delta >= timePerTick) {
            fpsCounter++;
            update();
            render();
            delta -= timePerTick;

        }
        if(fpsTimer >= 1000000000) {
            System.out.println("FPS: " + fpsCounter);
            fpsTimer = 0;
            fpsCounter = 0;
        }

        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
Respuesta 1

No debes apuntar a obtener 60 cuadros por segundo. En su lugar, debe apuntar a obtener 1 fotograma por 1/60 de segundo.

La diferencia, y la razón por la que está viendo un retraso a 60 FPS, es que actualmente si ve un retraso de 200 ms por cualquier motivo, simplemente renderiza 59 fotogramas en los 800 ms restantes. Esto todavía sale a 60 FPS, pero claramente no de una manera que sea significativa para la experiencia.

En su lugar, puede asignar ~ 16 ms a cada cuadro. Si un marco toma menos tiempo, duerme el resto. Si lleva más tiempo, omita el render()siguiente fotograma (pero consérvelo a update()menos que pueda reescribirlo para admitir pasos de tiempo fluido). De esta manera, sus números de FPS serán más representativos y mostrarán todos los diversos problemas de programación y GC que actualmente está ocultando al promediarlos durante un período prolongado.

Respuesta: 2

Tengo problemas para buscar un Hashtable para un String xmlMatch en particular. Esto se deriva del contenido de una etiqueta div particular. He incluido el código que uso para buscar en el XML y para definir ...

Estoy usando el cliente simple Prometheus Java dentro de un servicio web para realizar un seguimiento de cuántos eventos resultan en un estado u otro. Puedo verificar dentro de los registros que se está invocando el contador ...

Estoy tratando de crear un objeto org.w3c.dom.Document a partir de una cadena xml. He seguido lo que muchos han sugerido en otras preguntas, pero el documento termina vacío. Lo que está mal con lo siguiente ...

Hice la media aritmética para toda la matriz ordenada, pero ahora quiero hacer la media aritmética para la primera mitad ordenada y la segunda mitad ordenada de la matriz. Ej: Mi matriz es: 77, 99, 44, 55, 22, 88, 11, ...