1

私が最初System.currentTimeMillis()に思い浮かぶのは、非常に正確で、long値を与え、パラメーターSwingTimersの要求としてはどこにあるかということです。正確だintとは思わないのですか?SwingTimers

2)単語のタイミングSwingTimerがxミリ秒かかるとします。タスクを繰り返す場合(カラオケアプリのように単語を強調表示する)、次のコードを含めました:

               /*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)同時に、カラオケメーカーとプレーヤーのソフトウェアがどのテクニックに従うのだろうか???、非常に正確です。

4

3 に答える 3

6

同時に、カラオケメーカーとプレーヤーのソフトウェアはどのテクニックに従うのだろうか?

カラオケソフトウェアには、拍子記号と拍子記号を入力し、歌詞とともに音符の長さ(全音符、二分音符、四分音符など)を入力するエンジンがあると思います。

エンジンは四分音符あたりのミリ秒数を計算し、その計算に基づいて一度に1文字を表示します。

音符の長さは手動で入力する必要があると思いますが、エンジンが音楽を聴いて音楽から音符の長さを決定すると、非常に効率的です。

完璧な時間を保つ

すでに決定しているように、Thread.sleep()とSwingタイマーは完璧な時間を維持しません。

正確な計時が必要な場合は、独自のタイマーを作成する必要があります。これが1つのバージョンです。

    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

タイムソースがどれほど正確であるかに関係なく、コンピュータ/ OSクロックに基づいてタイミングを設定するアプローチは、一般的に欠陥がありますが、タイミングがそれほど正確である必要がないシナリオではうまくいく場合があります。

賢明なアプローチは、同期したいものからタイミング情報を取得することです。カラオケの場合は、オーディオの再生から経過した時間を取得し、それに応答します。この方法は、一般的な頭痛の種を自然に回避します。オーディオ再生での(ユーザーが開始した)一時停止の処理と、オーディオとシステムハードウェア間のわずかな時間のずれです。

于 2013-01-30T18:09:47.237 に答える
2

私たちは時間通りに正確に到着することは決してできないことを受け入れなければなりません。早くても遅くてもかまいません。

長年考えてみてください。毎秒24フレームで、連続して見える映画が作られています。そして今、59 FPSに移行しましたか?したがって、+/-20ms程度は人間には気づかれません。

アプリケーションで電子レベルで正確なタイミングが必要な場合は、スケジューリングと同時実行によってあらゆる種類の問題が発生する可能性があることを考慮してください。私が2000年問題の周りのC******eで働いていたとき、それは大きな問題であり、ビデオ設定などの影響を受けることがよくありました。タイミング関連の問題のアーティファクトは、レイテンシー、グリッチ、ピッチの不正確さとして現れました。

whileループメソッドを使用するとします(私の擬似コードを許してください):

/ **擬似コード** /

something.idLikeToTriggerNow();

time_now = time_then = system.getMicroseconds();

while(time_now <time_then + 1000){

; // NOP

time_now = system.getMicroseconds();

}

something.idLikeToTrigger1msLater();

/ **擬似コードを終了します** /

これは、入力してから1ミリ秒前に外に出ないことを保証するだけです。ただし、ノートンアンチウイルスが原因で、システム時刻の取得が中断され、代わりに0.5秒後に出る可能性があります。私のポイントは、特にJavaとは何の関係もありません。また、whileループが正常に機能した場合でも、NVidiaドライバーによって次のアクションが遅延する可能性があります。これは、壮大なスキームではJavaアプリよりも優先度が高い可能性があります。

2つのイベントが1ms離れて、おそらく+/- 100usの許容範囲になる可能性が高くなるJavaのアプローチはありますか?

于 2014-08-03T02:16:02.810 に答える