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

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 координаты

Связи​