2014-04-18 38 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命名約定,以及一般更改名稱