4

我正在学习一个教程,下面是生成逻辑和框架更新的运行方法。我了解滴答声如何以 60 滴答声/秒的速度更新,但我不明白我们如何在这里调整每秒帧数。

现在使用 Thread.sleep(2),每秒帧数约为 460。没有它,数字会大幅上升,每秒更新约 1000 万次。代码 Thread.sleep(2) 仅将线程挂起 2 毫秒,对吗?为什么/如何 Thread.sleep 在这里准确地工作以降低它这么低?

创建一个 nsPerFrame = 1000000000D/ (FPS)D 来设置我想要的任何 FPS 不是更简单吗?

public void run(){
    long lastTime = System.nanoTime();
    double nsPerTick = 1000000000D / 60D;

    int frames = 0;
    int ticks = 0;

    long lastTimer = System.currentTimeMillis();
    double delta = 0;

    while(running){
        long now = System.nanoTime();
        delta += (now - lastTime) / nsPerTick;
        lastTime = now;

        while(delta >= 1){
            ticks++;
            tick();
            delta-= 1;
        }

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

        frames++;
        render();

        if(System.currentTimeMillis() - lastTimer >= 1000){
            lastTimer += 1000;
            System.out.println(ticks + "," + frames);
            frames = 0;
            ticks = 0;
        }
    }
}
4

1 回答 1

5

Well在您的-loopsleep(2)中被重复running调用,因此在这种情况下,硬上限是每秒 500 个周期(1000 毫秒除以 2 毫秒),而您测量的 460 fps 非常接近。

果然,您可以根据需要调整睡眠持续时间,如果需要,将其填充到Thread#sleep(long, int)第二个参数为“nanos”的精度更高的方法中(请查看文档以获取警告!)。

你的情况的公式是FPS = 1000 ms / sleep duration in ms。从中得出:sleep duration in ms = 1000 ms / FPS

于 2014-06-25T10:11:26.373 回答