2

javascript のフレームレート カウンターで予期しない結果が発生しているようです。最近までカウンターは問題なく、小さな js アプリを 30fps で実行していました。

setTimeout() を使用します (システムの「遅れ」に対抗するための時間調整付き)。

window.requestAnimFrame = (function() 
{
    return function (callback) {
        time += FPS;
        Heartbeat._eTime = (new Date().getTime() - Heartbeat._start);
        var diff = Heartbeat._eTime - time;

        Heartbeat._delta = FPS - diff;
        Heartbeat._deltaS = Heartbeat._delta / 1000;

        window.setTimeout(callback, FPS - diff);
    };
})();

ハートビートは、フレーム レート情報を含む単なるオブジェクトです。

*ここに私の問題があります:*

_MainLoopHandler: function () {

    timer = new Date().getTime();
    counter = timer;

    while (this._messages.length > 0 && (counter - timer) < 5)
    {
        // process messages from _messages array
    }

    counter = new Date().getTime();
    // THE ABOVE IS HAPPY AT 30 FPS


    while ((counter - timer) < 6) {
        1 + 1;
    }
    // THE ABOVE WHILE IS VERY UNHAPPY :(

}

したがって、上記のコード ブロックは、33.33 ミリ秒 (30 fps) ごとに setTimeout から呼び出される関数です。ループアウト中に下を取ると、FPS カウンターは 30fps で満足に座ります。しかし、そのままにしておくと、FPS カウンターが狂ってしまいます。200FPS 300FPS まで上がり、突然 -200FPS -10FPS 0.01FPS になります。完全に壁から外れています。while ループは、「フレーム」ごとにおそらく 10 回しか実行されません。

また、ハードコーディングされた値 5 と 6 は、ループの処理中に (負荷分散のため) 5 ミリ秒または 6 ミリ秒が経過したかどうかを確認するための単純なチェックです。

これは単に JavaScript が大量の情報を処理できないのか、それとも他の誰かが同様の問題を抱えているのか.

ありがとう!

4

1 に答える 1

0

何が起こっているのかよくわかりませんが、ローカル変数を使用して時間を制御し、一度にcounter1 つのメッセージを常に再評価して処理する必要があると思います。また、最後のループがよくわかりません (変数の名前も変更しました)。

_MainLoopHandler: function () {

  var start = new Date().getTime();
  var current;

  do {
    if (this._messages.length === 0) break;
    // process 1 message
    current = new Date().getTime();
  } while (current - start < 5);

}

コードを合理化するために、タイミングの問題をオブジェクト (図示せず) にカプセル化することもできます。

_MainLoopHandler: function () {

  var timing = new Timing();

  do {
    if (this._messages.length === 0) break;
    // process 1 message
  } while (timing.elapsed() < 5);

}
于 2012-06-03T16:33:02.863 に答える