DedicatedWorkerGlobalScope: метод requestAnimationFrame()
Базовая версия 2023
Новое
С марта 2023 года эта функция работает на последних версиях устройств и браузеров. Возможно, эта функция не будет работать на более старых устройствах или браузерах.
Примечание: Эта функция доступна только в специализированных веб-воркерах.
Метод requestAnimationFrame() интерфейса DedicatedWorkerGlobalScope сообщает браузеру о необходимости выполнить запрос на кадр анимации и вызвать предоставленную пользователем функцию обратного вызова перед следующей перерисовкой.
Частота вызовов функции обратного вызова, как правило, соответствует частоте обновления дисплея. Наиболее распространённая частота обновления — 60 Гц (60 циклов/кадров в секунду), но также широко используются частоты 75 Гц, 120 Гц и 144 Гц. Вызовы requestAnimationFrame() в большинстве браузеров приостанавливаются при работе во вкладках фона или скрытых <iframe>, чтобы улучшить производительность и время автономной работы.
Вызов метода requestAnimationFrame() планирует только один вызов функции обратного вызова. Если вы хотите анимировать другой кадр, ваша функция обратного вызова должна снова вызвать requestAnimationFrame().
Предупреждение: Всегда используйте первый аргумент (или другой метод получения текущего времени) для расчета того, насколько анимация продвинется в кадре — иначе анимация будет выполняться быстрее на экранах с высокой частотой обновления. Способы выполнения этого показаны в примерах ниже.
Для вызова метода requestAnimationFrame() текущий рабочий процесс должен иметь связанное владельческое window. Это означает, что текущий рабочий процесс должен быть создан window или специализированным рабочим процессом, который также имеет связанное владельческое window.
Синтаксис
requestAnimationFrame(callback)
Параметры
callback-
Функция, которая вызывается, когда пришло время обновить анимацию для следующей перерисовки. Эта функция обратного вызова получает один аргумент:
timestamp-
DOMHighResTimeStamp, указывающий конечное время рендеринга предыдущего кадра (на основе количества миллисекунд с момента начала отсчёта времени). Значение timestamp — десятичное число в миллисекундах, но с минимальной точностью в 1 миллисекунду. Значение timestamp также похоже на вызовperformance.now()в начале функции обратного вызова, но никогда не равно ему.Когда несколько функций обратного вызова, очередированных методом
requestAnimationFrame(), начинают срабатывать в одном кадре, каждая из них получает одно и то же значение timestamp, даже если во время обработки каждой предыдущей функции обратного вызова прошло время.
Возвращаемое значение
Целочисленное значение long, являющееся идентификатором запроса, уникально определяющим запись в списке функций обратного вызова. Это ненулевое значение, но вы не можете делать никаких других предположений о нём. Вы можете передать это значение методу cancelAnimationFrame(), чтобы отменить запрос обратного вызова для обновления, при этом отмена должна быть выполнена в том же рабочем процессе.
Исключения
-
NotSupportedErrorDOMException -
Выбрасывается, если метод не поддерживается текущим рабочим процессом.
Примеры
В основном потоке мы начинаем с передачи управления элементом <canvas> в OffscreenCanvas, используя HTMLCanvasElement.transferControlToOffscreen(), затем отправляем сообщение в рабочий процесс, чтобы "start" выполнить работу с внеэкранным холстом:
const offscreenCanvas = document
.querySelector("canvas")
.transferControlToOffscreen();
worker.postMessage(
{
type: "start",
canvas: offscreenCanvas,
},
[offscreenCanvas],
);
При получении сообщения "start", рабочий процесс запускает анимацию, перемещая прямоугольник слева направо. При получении сообщения "stop" он остановит анимацию.
let ctx;
let pos = 0;
let handle;
function draw(dt) {
ctx.clearRect(0, 0, 100, 100);
ctx.fillRect(pos, 0, 10, 10);
pos += 10 * dt;
handle = self.requestAnimationFrame(draw);
}
self.addEventListener("message", (e) => {
if (e.data.type === "start") {
const transferredCanvas = e.data.canvas;
ctx = transferredCanvas.getContext("2d");
handle = self.requestAnimationFrame(draw);
}
if (e.data.type === "stop") {
self.cancelAnimationFrame(handle);
}
});
Наконец, если необходимо, основной поток может отправить сообщение "stop" в рабочий процесс, чтобы остановить анимацию:
worker.postMessage({
type: "stop",
});
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari в iOS | Samsung Internet | WebView Android | |
requestAnimationFrame |
69Не поддерживается во вложенных веб-воркерах. См. баг 41483010. |
79Не поддерживается во вложенных веб-воркерах. См. баг 41483010. |
99 | 56Не поддерживается во вложенных веб-воркерах. См. баг 41483010. |
16.4 | 69Не поддерживается во вложенных веб-воркерах. См. баг 41483010. |
99 | 48Не поддерживается во вложенных веб-воркерах. См. баг 41483010. |
16.4 | 10.0Не поддерживается во вложенных веб-воркерах. См. баг 41483010. |
67 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope/requestAnimationFrame