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

High-Level API — абстракция, контекст, окно и ввод

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

High-Level API (высокоуровневый графический API) — набор команд "нарисуй прямоугольник", "открой окно", "прочитай клавишу". Вы вызываете fillRect, pygame.draw.circle или Graphics.DrawMesh, драйвер GPU остаётся за кадром.


Слои абстракции

УровеньКонтрольСкорость входа
Highнизкийчасы
Mid APIсреднийнедели
Vulkan, D3D12максимальныймесяцы

Контекст рендеринга

Контекст — объект, через который идут все команды рисования. Без активного контекста draw-вызовы игнорируются.

ПлатформаКак получить
Canvas 2Dcanvas.getContext('2d')
WebGLcanvas.getContext('webgl2')
Pygamescreen = pygame.display.set_mode((w, h))
SDL2SDL_CreateRenderer или GL context
GLFW + OpenGLglfwMakeContextCurrent(window)
Unityкамера + SpriteRenderer / UI Canvas

Стек состояний Canvas 2D

ctx.save() запоминает цвет, толщину линии, трансформацию. ctx.restore() откатывает. Без пары save/restore поворот одного спрайта сдвинет все следующие объекты.

Частые свойства:

  • fillStyle, strokeStyle
  • lineWidth, globalAlpha
  • font, textAlign

Окно и HiDPI

HiDPI (экраны с высокой плотностью пикселей, Retina) — логический размер в CSS и размер буфера canvas различаются.

const dpr = window.devicePixelRatio || 1;
canvas.width = logicalW * dpr;
canvas.height = logicalH * dpr;
ctx.scale(dpr, dpr);

Без масштабирования картинка размыта. При resize пересчитывайте буфер и projection в 3D.

События завершения:

  • веб — beforeunload
  • SDL — SDL_QUIT
  • Windows — WM_CLOSE

Потеря фокуса вкладки — пауза звука и иногда симуляции.

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


Ввод отдельно от render

Handler события только пишет в модель. Реакция — в update.

const keys = {};
window.addEventListener('keydown', (e) => { keys[e.code] = true; });
window.addEventListener('keyup', (e) => { keys[e.code] = false; });

function update(dt) {
if (keys.ArrowLeft) player.vx = -200;
}
СобытиеWebPygame
Клавишаkeydown / keyupKEYDOWN / KEYUP
Мышьmousedown, mousemoveMOUSEMOTION
Touchtouchstart (+ preventDefault)
Выходзакрытие вкладкиpygame.QUIT

Координаты мыши:

  1. getBoundingClientRect()
  2. масштаб в логические единицы canvas
  3. offset камеры → мировые координаты

Retained mode и Immediate mode

ImmediateRetained
Кто хранит сценувы каждый кадрплатформа
ПримерыCanvas, Pygame drawDOM, WPF, Unity
Перерисовкаclear и всё зановотолько изменённые узлы

В Canvas вы восстанавливаете картинку из модели 60 раз в секунду. В WPF платформа перерисовывает изменившиеся Visual.


Выбор стека

ЗадачаИнструмент
График, дашбордChart.js, D3, Matplotlib
2D игра в браузереCanvas, Phaser
2D игра desktopPygame, MonoGame
3D вебThree.js, Babylon.js
Коммерческая 3D играUnity, Unreal, Godot
Нативный UIWPF, MAUI, Qt
Максимум производительностиVulkan, D3D12

Частые ошибки

ОшибкаСледствие
Рисование в keydownдубли кадров, лаг
Забытый devicePixelRatioмыло на Retina
Нет save/restore вокруг rotateсдвиг всей сцены
Глобальный ctx.scale без сбросаневерные hit-test координаты

Связи