4

mousemoveこのサイトで検索した結果、ブラウザのイベント頻度を制御できないことがわかりました。

mousemoveそのため、遅延イベントの問題を解決するために、ある種の外挿法を適用したいと考えています。

イベントがトリガーされたときのすべてのマウス位置を記録しmousemove、加速度を計算します (有限差分を使用して速度を取得し、次に加速度を取得します)。

その後、関数で、最後の関数呼び出しrender()から経過したデルタ時間を測定します。render()最後に、加速度と で位置を外挿しdtます。

しかし、この方法を使用しても大きな効果は見られません。何か間違っていることでも?

編集:ここで小さな実行例を作成します。(意味不明な質問ですみません)

https://gist.github.com/3858124

4

2 に答える 2

1

コードを要点に貼り付けた直後に、問題に気づき、バグを修正しました。

問題は:

NDC 座標を使用して導関数を計算し、ワールド空間座標を使用して外挿を行います。

これは新しいコードです:

https://gist.github.com/3858277

結論: ラグにはある程度の影響がありますがmouseevent、それほどではありません。また、(悪い) 副作用として、マウスの動きによって緊急ブレーキがかかると、オーバーシュートが発生します。

私はまだより良い解決策を探しています。ご意見/ご提案は大歓迎です。ありがとうございました。

于 2012-10-09T12:01:15.280 に答える
0

外挿でうまくいくかどうかはわかりません。現在のすべてのブラウザーは、タブごと (Chrome) またはブラウザー ウィンドウごと (Firefox) の、javascript 用の単一のスレッドを維持します。そのため、スクリプトで作業を行っている場合、ブラウザはスクリプトの実行中に mousemove イベントをまったくトリガーしません*。

したがって、mousemove の更新頻度を改善する最善の方法は、他の JavaScript を最適化して、mousemove イベントの邪魔にならないようにすることです。1 つの方法は、より多くの非同期呼び出しを使用することです。そのため、ループの次のステップで呼び出すコードを記述できます。setTimeout(nextFunc, 0)これにより、スクリプトから制御が返され、ループの次のステップの前にイベントをトリガーできるようになります。

* シングル スレッドと同期計算に関するルールの例外は WebWorker です。これにより、特定の一連の処理を残りの実行と並行して実行できます。これは主に DOM を必要としないものです。

于 2012-10-09T12:09:58.947 に答える