1

让我印象深刻的第一件事:System.currentTimeMillis()我认为非常准确,给出了一个long值,以及作为参数SwingTimers请求的位置int;它说什么?不要认为SwingTimers是准确的?

SwingTimer2)假设用x毫秒计时一个单词;如果我们正在重复一项任务(突出显示一个词,例如卡拉 OK 应用程序),我包含以下代码:

               /*see the time taken for each letter*/                    
                 int tik=(int) delay / words[index].length();
 /* make adjustment(subtract few millisecs)  as per the time taken by each word*/
                   if(tik <69)
                    timer.setDelay((int) (delay / words[index].length())-3);
                   if(tik >=69&&tik<=149)
                    timer.setDelay((int) (delay / words[index].length())-6);
                   else if(tik <=150)
                       timer.setDelay((int) (delay / words[index].length())-9);
                   else if(tik >150)
                   timer.setDelay((int) (delay / words[index].length())-100);

工作安静,但我肯定我不能依赖这个,因为时间,长度可能会改变!如何克服这个问题?因为几毫秒的变化可能会给我带来灾难性的结果。

3)同时我想知道卡拉OK制作器和播放器软件遵循哪些技术???,非常准确。

4

3 回答 3

6

同时我想知道卡拉 OK 制作和播放器软件遵循哪些技术?

我猜卡拉OK软件有一个引擎,可以输入节拍和拍号,并输入音符时长(全音符、二分音符、四分音符等)和歌词。

引擎计算每个四分音符的毫秒数,并根据计算结果一次显示一个字母。

我怀疑必须手动输入音符时长,但如果引擎听音乐并从音乐中确定音符时长,那将非常有效。

保持完美的时间

正如您已经确定的那样,Thread.sleep() 和 Swing 计时器不会保持完美的时间。

如果您想要精确计时,您将不得不建立自己的计时器。这是一个版本。

    public void moreAccurateTimer(int period) { // Sleep time in
                                                // milliseconds
        long beforeTime, timeDiff, sleepTime;
        beforeTime = System.currentTimeMillis();
        boolean running = true;
        while (running) {
            doStuff();

            timeDiff = System.currentTimeMillis() - beforeTime;
            sleepTime = period - timeDiff;

            if (sleepTime <= 0L) { // Even if doing stuff took longer than
                                    // period
                sleepTime = 5L; // sleep some anyway
            }

            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
            }

            beforeTime = System.currentTimeMillis();
        }
    }
于 2013-01-30T17:58:20.610 回答
6

基于计算机/操作系统时钟的计时方法,无论时间源有多准确 -通常都是有缺陷的,尽管在计时不需要那么准确的某些情况下它可能会正常工作。

一个聪明的方法是从你想要同步的东西中获取时间信息 - 所以对于卡拉 OK,获取从播放音频经过的时间并做出响应。这种方法自然地避免了常见的头痛:处理(用户发起的)音频播放中的暂停以及音频和系统硬件之间的微小时间偏差。

于 2013-01-30T18:09:47.237 回答
2

我们必须接受我们永远无法准确准时到达的事实;我们可以早点或晚点。

考虑多年以来,每秒 24 帧的速度一直在制作连续观看的电影。现在,我们搬到了 59 FPS?因此,+/- 20ms 左右对人类来说是不明显的。

如果您的应用程序需要电子级别的精确计时,请考虑调度和并发可能会导致各种问题。当我在 C******e 工作时,Y2K 前后是一件大事,并且经常受到视频设置等的影响。时间相关问题的伪影表现为延迟、故障和音高不准确。

假设我们使用 while 循环方法(请原谅我的伪代码):

/ ** 伪代码 ** /

something.idLikeToTriggerNow();

time_now = time_then = system.getMicroseconds();

而 (time_now < time_then + 1000){

; //NOP

time_now = system.getMicroseconds();

}

something.idLikeToTrigger1msLater();

/ **结束伪代码** /

这只能保证你在进入后一毫秒之前不会离开。但是,您可能会以某种方式中断获取系统时间,并在半秒后退出,而不是因为可能是 Norton Antivirus。我的观点与 Java 无关,尤其是。此外,即使 while 循环运行良好,下一个操作也可能会被您的 NVidia 驱动程序延迟,这可能比总体方案中的 Java 应用程序具有更高的优先级。

Java中是否有一种方法可以使这两个事件更有可能相隔1ms,以达到+/- 100us的容差?

于 2014-08-03T02:16:02.810 回答