while循环中的Java条件无法评估

时间:2014-04-18 16:47:05

标签: java loops conditional

我在while循环中遇到条件时遇到问题而无法评估。我试图每1/60秒执行一次操作。以下代码不打印"完成"每1/60秒,它只会每隔几秒打印一次。我检查过增量时间是否正常(我的电脑上约为2E-6到5E-6)。所以,我不确定为什么if语句中的代码不是每1/60秒发生一次。

    float p_dt = 1.f/60.f;

    float u_time = 0.f;

    while (true)
    {
        float t_ft = serverClock.restart().asSeconds(); //Gets the delta time

        u_time += t_ft;

        if( u_time > p_dt )
        {
            System.out.println("Done");
            u_time = 0;
        }
    }

编辑: 就I / O速度而言,我不认为这是问题所在。 "完成"每3-5秒打印一次,所以看起来这里有一个更大的问题。另外,在我的实际程序中,还有一些其他的东西正在评估条件。最后,如果我在条件之前添加print语句以跟踪u_time,它会打印出每秒60"完成" s。我不认为这是一个I / O问题,因为在条件内调用的函数每隔3-5秒才被调用一次,就像print语句一样。

此外,serverClock是一个JSFML Clock对象,一个包含其他系统工具的OpenGL包装器。

2 个答案:

答案 0 :(得分:0)

这不是一个答案,但在这里放置代码更容易。

请你试试这个。代码应该每1/60秒打印一行信息。希望我们通过此输出获得更多信息。

    float p_dt = 1.f / 60.f;

    float u_time = 0.f;
    long timer = System.currentTimeMillis() + 1000 / 60;
    while (true) {
        float t_ft = serverClock.restart().asSeconds(); //Gets the delta time
        u_time += t_ft;
        if (timer <= System.currentTimeMillis()) {
            System.out.println("t_ft: " + t_ft + " u_time: " + u_time);
            timer = System.currentTimeMillis() + 1000 / 60;
        }
        if (u_time > p_dt) {
            System.out.println("Done");
            u_time = 0;
        }
    }

答案 1 :(得分:0)

刚检查过,但找不到serverClock,所以我硬编码了你的t_ft(2e-6)的值。我还在if条件中添加了一个计数器,以查看确切的计数。对于一些测试,它似乎总是每秒递增60次。因此,如果你没有每秒“完成”打印60次,它可能与IO有关(注意System.out.print本身很慢)或serverClock(因为我没有测试它)。

注意:有更好的方法可以每秒打印60次,例如使用Timer和TimerTasks(http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html)。增加你自己的变量是非常危险的,因为你实际上无法确定你的代码是否会被执行(JVM和整个系统也占用CPU的时间,你可能在后台运行很多线程)。

注意2:考虑使用Java命名约定,以及一般更改名称(t_ft,u_time和p_dt不是大多数自我解释名称,是它们。)