17

ユーザーが自分のWebサイトを閲覧しているときに、Webワーカーを使用してバックグラウンド機能を提供することを考えています(これがWebワーカーの目的ですよね?)。ただし、スクロールが遅くなったり、コントロールが応答しなくなったりして、ユーザーエクスペリエンスが損なわれるリスクを冒したくありません。ただし、WebワーカーはOSスレッドにマップされているため、これらのスレッドの優先度をある程度制御できると思います。私が知っているように、現在のAPIにはそのようなものはありません。これを達成する方法を知っていますか?ハックしても?

4

2 に答える 2

11

まあ、このような低レベルの詳細を制御するためのAPI呼び出しはありません。ただし、最初にやりたいことを実装してから、ユーザーエクスペリエンスのパフォーマンスへの影響が大きすぎるかどうかをテストする必要があると思います。スレッドの実行方法を細かく制御できなかったため、基盤となる実装によって適切に管理されていると思います。

于 2012-01-02T11:17:39.803 に答える
9

ハックしても?[...]ユーザーが写真をアップロードし、ワーカーがPhotoshopのようなフィルターを適用します。これは、CPUにかなりの負荷がかかります。その後、ワーカーはメインスレッドに警告します。

これがハックです。

コードの速度を落とします。このようなものは、私が現在粒子シミュレーションに使用しているものです。

var TIME_STEP = 10,
    paused = false,
    state; // set by commands.start()

function main_loop () {
    if (paused) {
        return;
    }

    // update state incrementally. Break your process into chunks
    // for example pixels or rows of pixels
    state = ____________;

    // send state or progress to main thread
    if (finished) {
        self.postMessage(state);
    } else {
        self.postMessage(progress);
    }

    setTimeout(main_loop, TIME_STEP);
}

var commands = {
    //...functions that can be called from main thread (pause/start/cancel/etc)...
};

function message_handler (event) {
    var data = event.data;
    var command = commands[data.command];

    command.apply(this, data.args);
}

self.addEventListener('message', message_handler, false);

TIME_STEPは計算間の時間であり、実行していることと、時間を増やす余裕がある時間によって異なる必要があります。この方法の良い点の1つは、反復間の一時停止およびキャンセル要求を受け入れることができることです。

于 2012-12-15T02:58:30.593 に答える