OffscreenCanvas
Baseline 2023 *
Новое
С марта 2023 года эта функция работает на последних версиях браузеров и устройствах. Возможно, эта функция не будет работать на старых устройствах или браузерах.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Примечание: Эта функция доступна в Потоках веб-работников.
При использовании элемента <canvas> или API холста, отрисовка, анимация и взаимодействие с пользователем обычно происходят в основной потоке выполнения веб-приложения. Вычисления, связанные с анимацией и отрисовкой холста, могут значительно повлиять на производительность приложения.
Интерфейс OffscreenCanvas предоставляет холст, который может быть отрисован вне экрана, разделяя DOM и API холста, так что элемент <canvas> больше не полностью зависит от DOM. Операции отрисовки также могут выполняться внутри контекста потока работ, что позволяет запускать некоторые задачи в отдельном потоке и избегать чрезмерной нагрузки на основной поток.
OffscreenCanvas — это передаваемый объект.
Конструкторы
OffscreenCanvas()-
Конструктор
OffscreenCanvas. Создаёт новый объектOffscreenCanvas.
Свойства экземпляра
OffscreenCanvas.height-
Высота холста вне экрана.
OffscreenCanvas.width-
Ширина холста вне экрана.
Методы экземпляра
OffscreenCanvas.getContext()-
Возвращает контекст рисования для холста вне экрана или
null, если идентификатор контекста не поддерживается или холст вне экрана уже настроен на другой режим контекста. OffscreenCanvas.convertToBlob()-
Создаёт объект
Blob, представляющий изображение, содержащееся в холсте. OffscreenCanvas.transferToImageBitmap()-
Создаёт объект
ImageBitmapиз самого последнего отрисованного изображенияOffscreenCanvas. См. его ссылку для важных замечаний по управлению этимImageBitmap.
События
Наследует события от своего родителя, EventTarget.
Прислушивайтесь к этим событиям, используя addEventListener() или назначив обработчик событий свойству oneventname этого интерфейса.
contextlost-
Срабатывает, если браузер обнаруживает, что контекст
OffscreenCanvasRenderingContext2Dутерян. contextrestored-
Срабатывает, если браузер успешно восстанавливает контекст
OffscreenCanvasRenderingContext2D.
Примеры
Синхронный вывод кадров, созданных объектом OffscreenCanvas
Один из способов использования API OffscreenCanvas — использование контекста отрисовки, полученного из объекта OffscreenCanvas, для генерации новых кадров. После завершения отрисовки нового кадра в этом контексте можно вызвать метод transferToImageBitmap() для сохранения последнего отрисованного изображения. Этот метод возвращает объект ImageBitmap, который может быть использован в различных API веб-приложений, а также на втором холсте, без создания копии.
Для отображения ImageBitmap, можно использовать контекст ImageBitmapRenderingContext, который можно создать, вызвав canvas.getContext("bitmaprenderer") на элементе холста (отображаемого). Этот контекст предоставляет только возможность заменить содержимое холста указанным ImageBitmap. Вызов ImageBitmapRenderingContext.transferFromImageBitmap() с ранее отрисованным и сохранённым ImageBitmap из OffscreenCanvas, отобразит ImageBitmap на холсте и передаст его владение холсту. Один OffscreenCanvas может передавать кадры в произвольное количество других объектов ImageBitmapRenderingContext.
Исходя из этих двух элементов <canvas>
<canvas id="one"></canvas> <canvas id="two"></canvas>
следующий код обеспечит отрисовку с использованием OffscreenCanvas как описано выше.
const one = document.getElementById("one").getContext("bitmaprenderer");
const two = document.getElementById("two").getContext("bitmaprenderer");
const offscreen = new OffscreenCanvas(256, 256);
const gl = offscreen.getContext("webgl");
// Perform some drawing for the first canvas using the gl context
const bitmapOne = offscreen.transferToImageBitmap();
one.transferFromImageBitmap(bitmapOne);
// Perform some more drawing for the second canvas
const bitmapTwo = offscreen.transferToImageBitmap();
two.transferFromImageBitmap(bitmapTwo);
Асинхронный вывод кадров, созданных объектом OffscreenCanvas
Другой способ использования API OffscreenCanvas — вызов transferControlToOffscreen() на элементе холста <canvas>, как в рабочем потоке, так и в основном потоке, который вернёт объект OffscreenCanvas из объекта HTMLCanvasElement из основного потока. Вызов getContext() затем получит контекст отрисовки из этого OffscreenCanvas.
Сценарий main.js (основной поток) может выглядеть так:
const htmlCanvas = document.getElementById("canvas");
const offscreen = htmlCanvas.transferControlToOffscreen();
const worker = new Worker("offscreen-canvas.js");
worker.postMessage({ canvas: offscreen }, [offscreen]);
В то время как сценарий offscreen-canvas.js (поток работ) может выглядеть так:
onmessage = (evt) => {
const canvas = evt.data.canvas;
const gl = canvas.getContext("webgl");
// Perform some drawing using the gl context
};
Также возможно использовать requestAnimationFrame() в потоках работ:
onmessage = (evt) => {
const canvas = evt.data.canvas;
const gl = canvas.getContext("webgl");
function render(time) {
// Perform some drawing using the gl context
requestAnimationFrame(render);
}
requestAnimationFrame(render);
};
Для полного примера, обратитесь к примеру OffscreenCanvas в источнике на GitHub или запустите пример OffscreenCanvas в режиме онлайн.
Спецификации
| Спецификация |
|---|
| HTML # the-offscreencanvas-interface |
Совместимость браузеров
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
OffscreenCanvas |
69 | 79 | 105 | 56 | 16.4 | 69 | 105 | 48 | 16.4 | 10.0 | 69 |
OffscreenCanvas |
69 | 79 | 105 | 56 | 16.4 | 69 | 105 | 48 | 16.4 | 10.0 | 69 |
contextlost_event |
99 | 99 | 125 | 85 | Нет | 99 | 125 | 68 | Нет | 18.0 | 99 |
contextrestored_event |
99 | 99 | 125 | 85 | Нет | 99 | 125 | 68 | Нет | 18.0 | 99 |
convertToBlob |
69 | 79 | 105105 | 56 | 16.4 | 69 | 105105 | 48 | 16.4 | 10.0 | 69 |
getContext |
69 | 79 | 105 | 56 | 16.4 | 69 | 105 | 48 | 16.4 | 10.0 | 69 |
height |
69 | 79 | 105 | 56 | 16.4 | 69 | 105 | 48 | 16.4 | 10.0 | 69 |
transferToImageBitmap |
69 | 79 | 105 | 56 | 16.4 | 69 | 105 | 48 | 16.4 | 10.0 | 69 |
width |
69 | 79 | 105 | 56 | 16.4 | 69 | 105 | 48 | 16.4 | 10.0 | 69 |
См. также
© 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/OffscreenCanvas