繁体   English   中英

Java - Thread.sleep里面的run方法

[英]Java - Thread.sleep inside run method

我正在学习一个教程,下面是生成逻辑和帧更新的run方法。 我理解滴答是如何更新60滴/秒,但我不明白我们如何调整每秒帧数。

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

是不是更简单的创建一个nsPerFrame = 1000000000D /(FPS)D来设置我想要的方式与刻度线的方式?

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;
        }
    }
}

在你的running -loop中重复调用well sleep(2) ,因此在这种情况下硬上限是每秒500个周期(1000 ms除以2 ms),你测得的460 fps非常接近。

果然你可以根据你的需要调整睡眠持续时间,如果需要的话,可以把它填入更高精度的方法Thread#sleep(long, int) ,其中第二个参数是“nanos”(看看文档中的注意事项! )。

你的情况的公式是FPS = 1000 ms / sleep duration in ms 从下面开始: sleep duration in ms = 1000 ms / FPS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM