Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
while循环中的Java条件无法计算_Java_Loops_Conditional - Fatal编程技术网

while循环中的Java条件无法计算

while循环中的Java条件无法计算,java,loops,conditional,Java,Loops,Conditional,我在while循环中遇到了无法评估的问题。我尝试每1/60秒执行一次操作符。下面的代码不是每1/60秒打印一次“完成”,而是每几秒钟打印一次。我已经检查了delta时间是否正常(在我的电脑上大约是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.

我在while循环中遇到了无法评估的问题。我尝试每1/60秒执行一次操作符。下面的代码不是每1/60秒打印一次“完成”,而是每几秒钟打印一次。我已经检查了delta时间是否正常(在我的电脑上大约是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个“Done”。我不认为这是一个I/O问题,因为条件中调用的函数每3-5秒调用一次,就像print语句一样


另外,serverClock是一个JSFML时钟对象,是一个OpenGL与其他系统工具的包装器。

这不是答案,但将代码放在这里更容易

请你试试这个好吗。代码应每隔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;
        }
    }
float p_dt=1.f/60.f;
浮动u_时间=0.f;
长定时器=System.currentTimeMillis()+1000/60;
while(true){
float t t_ft=serverClock.restart().asSeconds();//获取增量时间
u_时间+=t_英尺;
如果(计时器p_dt){
系统输出打印项次(“完成”);
u_时间=0;
}
}

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

注意:有更好的方法可以每秒打印60次,例如使用Timer和TimerTasks()。增加您自己的变量是相当危险的,因为您实际上无法确定代码是否会持续执行(JVM和整个系统也需要CPU的时间,而且您可能有许多线程在后台运行)


2:考虑使用java命名约定,以及一般的名称(Tyft,uyTimeand PyDT不是最能解释的名字,是吗?)

你使用的是java的实时版本吗?这可能与你正在执行的I/O有关。你是否得到了正确的打印数量,或者打印数量很少?这不太可能是你的问题,但是u_time=0行应该是:“u_time-=p_dt”,否则每次迭代都会损失分数秒,这将导致输出的总体损失(但不是你所看到的极端情况)。问题似乎出在serverClock行中,但由于此处没有任何代码,因此无法确定是否可以提供更多帮助。System.out.println()使用缓冲区,不应信任其计时功能。我见过eclipse的控制台甚至以错误的顺序打印东西。如果你真的关心毫秒,也许你应该只使用屏幕上的元素。我使用这种技术来实际调用一个物理更新函数,屏幕上的对象只会每3-5秒更新一次,所以我认为这不是打印速度的问题。我尝试在条件之前添加一个
u\u time
的打印检查,然后“完成”每秒打印大约60次。如果没有这个打印语句,“完成”只会每隔3-5秒打印一次。您可以发布两行或三行
System.out.println(“t_ft:+t_ft+”u_time:+u_time”)输出以便我们获得更多信息,请?