【问题标题】:Android Simple Timing QuestionAndroid 简单计时问题
【发布时间】:2011-03-25 21:05:29
【问题描述】:

我需要为一个小游戏实现毫秒精度的计时器。哪种方法最适合这种情况?我目前的方法是使用 System.currentTimeMillis()。它似乎工作得很好,但也许有一些我不知道的陷阱。计时的标准方法是什么?

【问题讨论】:

    标签: android timing


    【解决方案1】:

    您的计时器只会与您的系统实现的一样好。它根本不会比这更好。

    作为一名前专业游戏开发人员(并且仍在做副项目),我建议不要满足毫秒级精度要求。你可能不需要它。

    使用此程序确定您的时钟精度:

    /*
    C:\junk>javac TimerTest.java
    
    C:\junk>java TimerTest
    Your delay is : 16 millis
    
    C:\junk>
    */
    class TimerTest {
    
        public static void main(String[] args) {
            long then = System.currentTimeMillis();
            long now = then;
                // this loop just spins until the time changes.
                // when it changes, we will see how accurate it is
            while((now = System.currentTimeMillis()) == then); // busy wait
            System.out.println("Your delay is : " + (now-then) + " millis");
    
        }
    }
    

    【讨论】:

    • 似乎有很多事情会影响该程序的输出,例如上下文切换。我认为您没有对currentTimeMillis 准确性施加太大压力是对的。
    • @Matthew,你说得对。诚然,当我运行它很多次(数百次)时,我得到一致的 16 或 17 次,从不改变。你说的正是我想说的:不要依赖currentTimeMillis 的准确性。
    • 感谢您的数据。这很有趣!
    • 这很有趣,但同时也具有误导性。我可能会对自己说“我运行了数百次,它总是 16 或 17”,但这只是我的系统。不同的系统可能对此具有完全不同的准确度。 Java 的目标是“一次编写,到处运行”,但如果你不小心,它就是“一次编写,处处失败”(这适用于 --any-- 语言,即使 Java 在过滤掉陷阱方面做得更好.
    • 注意:在 Android 上,最好使用 System.nanoTime()。不是因为纳秒级的分辨率,而是因为它基于单调时钟。如果运营商推送时间更新,currentTimeMillis 的值可以向前或向后跳跃,如果您使用它来延迟,这可能会导致您的游戏暂停一段时间。 (FWIW,通过上面的 nanoTime() 测试,我确实在设备上得到了更细粒度的结果。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多