es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Animación entrecortada en el motor de renderizado 2D de Java cuando el objeto se mueve rápido.

He estado haciendo un juego simple en el motor de renderización 2D de Java y me encontré con un problema, donde si un objeto se mueve lo suficientemente rápido, la animación titubeará cada par de segundos más o menos.
Quiero que sea más suave, para que la animación no parezca de baja calidad.

Este es el método run de mi clase Principal:

@Override
public void run() {
this.requestFocus();

long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0, ticks = 0;

long renderLastTime = System.nanoTime();
double amountOfRenders = 60;
double renderNs = 1000000000 / amountOfRenders;
double renderDelta = 0;

while (isRunning) {
    long now = System.nanoTime();
    delta += (now - lastTime) / ns;
    lastTime = now;
    while (delta >= 1) {
        tick();
        ticks++;
        delta--;
    }

    now = System.nanoTime();
    renderDelta += (now - renderLastTime) / renderNs;
    renderLastTime = now;
    while (isRunning && renderDelta >= 1) {
        render();
        frames++;
        renderDelta--;
    }

    if(System.currentTimeMillis() - timer > 1000) {
        timer += 1000;
        FPS = frames;
        UPS = ticks;
        frames = 0;
        ticks = 0;
    }
}
stop();

}

Si necesita más código, por favor comente.

¡Por favor, ayúdame para hacer que este juego sea más suave!

Atentamente,
JulekPL

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para resolver el problema de tartamudeo es implementar doble buffering. Doble buffering significa renderizar la imagen en un búfer fuera de pantalla (oculto al usuario), luego intercambiar los búferes para que la nueva imagen aparezca en la pantalla sin parpadeos ni retrasos.

    Para implementar el doble buffering, puede crear una estrategia de búfer en el constructor de su clase principal:

    public Main() {
        JFrame frame = new JFrame("My Game");
        // Otro código...
    
        createBufferStrategy(2); // Crear estrategia de doble búfer
    
        // Otro código...
    }
    

    Luego, modifique su método de renderización para dibujar en el búfer fuera de pantalla antes de voltear los búferes:

    private void render() {
        BufferStrategy bufferStrategy = getBufferStrategy();
        Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
    
        // Limpiar el búfer
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());
    
        // Dibuje los objetos de su juego
        // ...
    
        // ¡Descarte los gráficos y gire los búferes!
        g.dispose();
        bufferStrategy.show();
    }
    

    De esta manera, la animación debería ser más suave y sin tartamudeos. También puede experimentar con otros enfoques, como optimizar su motor de juego o utilizar la aceleración por hardware.

Comments are closed.