2013-06-02 35 views
4

當測試我們的遊戲時,這是嚴重依賴於System.currentTimeMillis(),我們遇到了一個惱人的錯誤。我們遊戲中的時間錯誤,currentTimeMillis凍結?

我們的遊戲使用一個delta時間戳數組,指示何時應該發生某些事情。這些時間戳與一段正在播放的音樂相匹配。

家庭測試完全沒有問題。在我們家進行測試時,不可能重現錯誤。

但是,在車內和城市之間駕車時進行測試會給我們提供時間戳和音樂之間的同步問題。我最好的猜測是,Android會凍結系統,包括系統定時器,因爲它正在交換網絡,或者尋找信號?

我試過在遊戲中插入一個假冒hick-up,當我按下某個按鈕時讓線程睡眠幾秒鐘。這顯然凍結了屏幕,但是當睡眠結束時,一切仍然同步。

重現此錯誤的唯一方法是乘坐汽車或公共汽車或火車旅行 - 當然這最有可能是大多數人在玩我們的遊戲時所在的地方。

問題是當然的,

  • 該怎麼辦呢?

  • 有沒有人有任何想法?

+0

你的遊戲是什麼?你能解釋一下嗎? –

+0

它現在在這裏:www.PirateDiamonds.com :-) –

+0

然後恭喜! :) –

回答

3

閱讀SystemClock

System.currentTimeMillis的()是標準的 「壁」 時鐘(時間和日期 ),因爲曆元表達毫秒。掛鐘可以由用戶或電話網絡設置的 (參見setCurrentTimeMillis(long)), ,因此時間可能會跳躍或向前跳躍不可預測。


uptimeMillis()以毫秒爲單位被計數,因爲系統引導。 當系統進入深度睡眠(CPU關閉,顯示器 黑暗,設備等待外部輸入)時,此時鐘停止,但不受時鐘 縮放,空閒或其他節能機制的影響。這是大多數間隔時間的基礎,如Thread.sleep(millls), Object.wait(millis)和System.nanoTime()。這個時鐘保證 爲單調,並適用於間隔時間間隔 不跨設備睡眠。

我認爲最好使用System.nanoTime()

+1

我結束了使用'SystemClock.elapsedRealtime()',到目前爲止我們還沒有看到錯誤。謝謝! –

+0

@mr_lou,很高興聽到這個消息。 –