Перейти к основному содержимому

Веб — Canvas 2D и WebGL

Разработчику

В браузере графика — это Web API, отдельно от языка JavaScript. Два главных пути:

  • Canvas 2D — команды "нарисуй фигуру"
  • WebGL — треугольники и шейдеры на GPU

Canvas 2D

<canvas id="game" width="640" height="360"></canvas>
const canvas = document.getElementById('game');
const ctx = canvas.getContext('2d');

Атрибуты width и height задают размер буфера в пикселях, CSS только растягивает отображение.

Группы API

ГруппаМетодыЗадача
ПрямоугольникиfillRect, clearRectфон, стирание кадра
Путиarc, lineTo, bezierCurveToфигуры
СтильfillStyle, globalAlphaцвет, прозрачность
ТекстfillText, fontHUD, подписи
КартинкиdrawImageспрайты, тайлмапы
Трансформыtranslate, rotate, scaleкамера, спрайт
Состояниеsave, restoreизоляция трансформаций

Модель Canvas

  • браузер хранит только пиксели буфера, без списка объектов сцены
  • каждый кадр — clearRect и отрисовка всего из модели
  • ось Y вниз, (0,0) — левый верхний угол
  • OffscreenCanvas — рендер в Web Worker
  • willReadFrequently: true при частом getImageData

Полный синтаксис — Canvas 2D / JavaScript.

Код ITЗагрузка примера кода…


WebGL — ближе к GPU

const gl = canvas.getContext('webgl2');
if (!gl) alert('WebGL2 недоступен');
Canvas 2DWebGL
команда "нарисуй круг"загрузка вершин треугольников
растеризация через Skiaшейдеры на GPU
быстрый стартвыше потолок FPS и 3D

Минимальный пайплайн WebGL

  1. Скомпилировать vertex и fragment shader (язык GLSL)
  2. Создать program, привязать атрибуты
  3. Загрузить VBOFloat32Array с координатами
  4. gl.drawArrays(gl.TRIANGLES, 0, count)
  5. Каждый кадр — clear и draw

Обёртки: Three.js, Babylon.js, regl, p5.js (режим WEBGL).


Стек в браузере

Ваш JS (update/render)
→ Canvas 2D API или WebGL API
→ Skia (2D) или ANGLE (GLES → D3D/Metal/Vulkan)
→ драйвер GPU
→ Compositor (слои video, canvas, DOM)
→ экран

Compositor<canvas> часто отдельный слой: прокрутка страницы не перерисовывает игру целиком.

Подробнее — глава 10.


requestAnimationFrame

requestAnimationFrame (rAF) — браузерный callback перед следующей отрисовкой, синхронизированный с монитором.

let last = 0;
function loop(t) {
const dt = Math.min((t - last) / 1000, 0.05);
last = t;
update(dt);
render(ctx);
requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
requestAnimationFramesetInterval(16)
Синхронизация с мониторомданет
Пауза в фоновой вкладкеданет
Для игрданет

См. буферизацию и игровой цикл.


DOM, SVG, CSS — когда Canvas не нужен

ТехнологияМодельПодходит для
DOM + CSSretained treeUI, текст, вёрстка
SVGвектор в DOMиконки, диаграммы
Canvasбитмапаигры, частицы
WebGLGPU mesh3D, тысячи спрайтов

Гибрид: меню на HTML, поле боя на <canvas> поверх.


Производительность

  • один sprite sheet вместо сотен загрузок Image
  • меньше drawImage с масштабированием каждый кадр
  • тысячи объектов → WebGL instancing
  • DevTools → Performance → Frames, GPU; вкладка Layers
  • WebGL: расширение Spector.js — захват draw calls

Play ITЗагрузка интерактивного демо…


Связи