我正在考虑在用户浏览我的网站时使用 Web Workers 提供一些后台功能(这就是 Web Workers 的用途,对吧?)。但是,我不想冒险通过导致延迟滚动、无响应的控件等来影响用户体验。Web Worker 映射在 OS 线程上,因此我希望对这些线程的优先级进行一些控制,但到目前为止据我所知,当前的 API 中没有这样的东西。你知道如何做到这一点吗?即使有黑客攻击?
问问题
2676 次
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
是计算之间的时间,并且需要根据您正在做什么以及您可以负担增加时间的时间而有所不同。这样做的一个好处是您可以在迭代之间接受暂停和取消请求。
于 2012-12-15T02:58:30.593 回答