3

ある種のレンダリング(webgl)を処理する長時間実行されているjavascriptコードがあります。これはある種の「アダプティブレンダリング」であり、時間の経過とともにサーフェスをより正確に計算します(つまり、シーンの「解像度」がますます正確になります)。

ユーザーがキーを押さない限り、またはマウスを動かさない限り、実行したいと思います。ここで述べたように、私はsetTimeoutまたはsetIntervalを使用して、他のイベントを処理するためにjavascriptに時間を与えることができます。

このjsFiddleでsetTimeoutおよびsetInterval遅延をテストしたところ、次の結果が観察されました。

setTimeout delay: 15-20 ms
setInterval delay: 2-4 ms

それは速いですが、それでも私の状況ではかなり使いにくいです。ユーザーに60fpsで実行する印象を与えるには、反応し、いくつかの計算を完了し、 16ミリ秒でレンダリングできる必要があります。

だからここに質問があります:

1)処理する着信ユーザー入力イベントがあるかどうかを確認する他の(より賢い)方法はありますか?

2)「長時間実行されるコードをユーザーが中断できるようにする」ために使用できるものは他にありますか?(多分ウェブワーカー?)

4

1 に答える 1

2

コードを小さなチャンクに分割し、タイマーティックで各チャンクを実行する必要があります。各タイマーティックの間に、ユーザーイベントを処理できます。また、長時間実行されるタイマー駆動プロセスの実行を停止する場合は、フラグを設定できます。

イベントを処理したり、保留中のイベントをチェックしたりする方法は他にありません。メインイベントループに戻る必要があります。つまり、実行のjavascriptスレッドを終了する必要があります。そして、イベントループに戻った後にさらにコードを実行できる唯一の方法は、イベントに応答するか、タイマーを使用することです。これは、JavaScriptの記述と設計の方法です。

他の唯一の選択肢はWebワーカーを使用することですが、WebワーカーはDOMにアクセスできず、古いブラウザーでは機能せず、メッセージパッシングを介してのみメインイベントループと通信できます。計算には適していますが、アニメーションには適していません。

于 2013-03-08T00:54:44.550 に答える