2014-04-18 39 views
0

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

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秒打印一次,所以看起来这里有更大的问题。另外,在我的实际程序中还有一些其他的事情正在评估条件。最后,如果我在条件之前添加打印语句以跟踪u_time,则会打印出每秒60个“完成”。我不认为这是一个I/O问题,因为在条件中调用的函数只是每3-5秒调用一次,就像print语句一样。

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

+2

是否使用实时版本(t_ft,u_time和p_dt不是大多数自地名释义的名字,是他们。)的Java? –

+0

这可能与您正在执行的I/O有关。你有没有得到正确的打印数量或几乎没有? –

+0

不太可能是你的问题,但u_time = 0行应该是:“u_time - = p_dt”,否则你每次迭代都会失去小数秒,这将导致整体输出丢失(但不是你说的'再见)。似乎问题必须在serverClock行,但没有任何代码在这里可用,不知道可以提供更多的帮助。 – user1676075

回答

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

我试着在条件之前添加'u_time'的打印检查,并且“完成”每秒打印出约60次。没有这个打印语句,“完成”每3-5秒打印一次。 – user1560249

+0

你可以发布两行或三行的'System.out.println(“t_ft:”+ t_ft +“u_time:”+ u_time);'输出所以我们可以获得更多信息吗? – drkunibar

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命名约定,以及一般更改名称