6

私が知っているすべてのブラウザーでサポートされている 1 ミリ秒未満のタイム ギャップを測定することは可能ですか?

クロームメソッド:window.performance.now()

現在、私はミリ秒の時間空間で FPS 測定を行っていますが、2 つの数値が最も近いミリ秒に丸められて同じ値になるため、1 ミリ秒未満が経過すると無限大になります。

クロスブラウザ関数がjavascriptで1ミリ秒未満のタイムギャップを計算することを知っている人はいますか?

4

3 に答える 3

3

正確なタイマーなしで正確な測定値を取得する方法は次のとおりです。ただし、タイミングが頻繁に発生する限り、あなたの場合はそうなることを願っています。

イベント期間の不正確な測定値を平均化/集計します。私のプロジェクトの 1 つのスニペット:

        var start = Date.now();
        ... (stuff to be timed)
        var now = Date.now();

        if (DEBUG.enabled) {
            var profile_this_iter = now - start;
            profile += (profile_this_iter - profile) * 0.02;
        }

新しい値を測定するたびに、測定値が 0.02 倍に近づきます。明らかに、それを少し調整したいと思うでしょう。これにより、半分の時間で 1 ミリ秒、半分の時間で 0 ミリ秒の期間を読み取る場合 (1 ミリ秒の分解能タイマーを使用)、0.5 ミリ秒前後で変動する平均を読み取ることができます。

これは明らかに、適切な高解像度タイマーの代わりにはなりません。しかし、私はこの単純なアルゴリズムを使用して、javascript プロジェクトに安っぽい FPS の読み取り値を与えます。より正確に、または変化に対するより迅速な応答が必要かどうかに応じて微調整できるダンピング係数が得られます。この単純さを考えると、改善された入力データなしで適切な表現を提供する、より洗練されたアルゴリズムを見つけるのは難しいでしょう。それを強化する方法の 1 つは、サンプリング自体の頻度に基づいてアプローチ係数 (0.02 定数) を調整することです (それが変化する場合)。 .

于 2013-02-22T02:45:48.193 に答える
1

実際には、fps を計算する別の方法があり、この問題を回避する方法になる可能性があります。1 秒間の実際のフレーム数をカウントすることです。これはかなり正確なはずです。

var fpsStart = new Date().getTime();
var fpsCounting = 0;
var fps = 0;
start_the_first_frame();

// Loop
function update(){
    do_time_consuming_stuff();
    fpsCounting++;
    var thisFrame = new Date().getTime();
    if(thisFrame - fpsStart >= 1000){
        fpsStart += 1000;
        fps = fpsCounting;
        fpsCounting = 0;
    }
    request_next_animation_frame();
}

PSはここに入力しただけで、テストされていないため、わずかな変更が必要になる場合があります。

lwjglチュートリアルでこのような方法を見たのを覚えています...

また、@StevenLu で指摘されているように、0.5 秒でフレーム数をカウントするように変更し、「fps」を 2 倍するか、さらに短い時間 (0.25 秒など) を掛けて、fps 値の更新がより頻繁になるようにすることができます。 .

于 2013-02-22T03:15:40.170 に答える
0

Chrome 20 では高解像度の時間が利用できますが、JS での時間解像度はブラウザ、デバイス、および状況に依存することに注意してください。4ms から 1000+ms の間で変化する可能性があります

于 2013-02-21T22:50:01.077 に答える