如何在 java 中设置最大 fps

how to set a max fps in java

我正在制作一款 2D 游戏,我意识到 FPS 大约是 500,但它一直下降到 440,这造成了可怕的滞后峰值,所以我想设置一个最大 fps 来阻止滞后峰值,但我不知道该怎么做。游戏循环:

    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;
    while(running){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
        while(delta >= 1){
            tick();
            delta--;
        }
        if(running)
            render();
    frames++;

    if(System.currentTimeMillis() - timer > 1000){
        timer += 1000;
        System.out.println("FPS: " + frames);
        frames = 0;
        }
    }
    stop();
}

只需使用与控制刻度数相同的控制机制。试试这个,然后把你想要的最大 FPS 放在 'amountOfRenders' 变量中。

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;
    int ticks = 0;

    long renderLastTime=System.nanoTime();
    double amtOfRenders = 200.0;//MAX FPS
    double renderNs=1000000000/amtOfRenders;
    double renderDelta = 0;

    while(running){
        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(running && renderDelta >= 1){
            render();
            frames++;
            renderDelta--;
        }

        if(System.currentTimeMillis() - timer > 1000){
            timer += 1000;
            System.out.println("FPS: " + frames);
            System.out.println("Ticks per second: " + ticks);
            frames = 0;
            ticks = 0;
        }
    }
    stop();
}