Игры и мультимедиа
Разработка игр, графика, звук
Сцена задаётся объёмно: модели из многоугольников (полигонов), свет и камера. Компьютер рассчитывает, как сцена видна из камеры, и строит плоскую картинку из пикселей — это рендеринг. В играх рендеринг повторяется десятки раз в секунду, поэтому камерой можно управлять на ходу.
✗ «Для 3D-графики нужен особый объёмный экран». Нет: экран плоский; компьютер хранит объёмную модель сцены и рассчитывает из неё обычную плоскую картинку.
Частота смены кадров (frames per second): игра каждую секунду рассчитывает и показывает десятки картинок заново. Кино хватает 24 кадр/с, в играх целятся в 30–60: игра ещё и отвечает на действия игрока, поэтому рывки заметнее. FPS падает, когда компьютер не успевает рассчитывать кадры вовремя.
✗ «Чем выше FPS, тем быстрее всё движется в игре». Нет: скорость игры не меняется — растёт плавность: на то же самое движение приходится больше кадров.
Non-player character — персонаж под управлением игры, а не игрока. Его поведение задаёт программа: торговец стоит на месте и продаёт, враг идёт к игроку, прохожий бродит по маршруту. Простые NPC действуют по жёстким правилам, у сложных поведение меняется в зависимости от того, что делает игрок.
✗ «За NPC играет другой человек». Нет: NPC управляет сама программа игры, а не игрок; продавец, прохожий и враг живут по заданным правилам.
Игровой движок для 2D- и 3D-игр. Сцена собирается из объектов, к каждому прикрепляются компоненты: модель, физика, скрипт. Поведение пишут скриптами на языке C#. Готовый проект собирается под компьютер, телефон и веб без переписывания кода.
✗ «Unity — это язык программирования». Нет: Unity — игровой движок; скрипты для него пишут на языке C#.
Иллюзия движения из последовательности неподвижных кадров: если они сменяются достаточно быстро, глаз «склеивает» их в непрерывное движение. В кино кадры меняются 24 раза в секунду; чем выше частота смены, тем плавнее картинка.
✗ «В анимации картинка по-настоящему движется». Нет: движение — иллюзия; на экране быстро сменяются неподвижные кадры, каждый чуть отличается от предыдущего.
Устройство ввода для игр: кнопки, крестовина и аналоговые стики превращают нажатия и наклоны в сигналы, которые игра читает каждый кадр. Подключается по проводу (USB) или по радио (Bluetooth). Стик передаёт не «да/нет», а направление и силу наклона.
✗ «Геймпад и джойстик — одно и то же». Джойстик — одна ручка-рычаг (например, для авиасимулятора); геймпад держат двумя руками, у него кнопки, крестовина и два мини-стика.
Короткая аудиозапись, которую игра проигрывает в ответ на событие: прыжок, попадание, клик по кнопке. В отличие от фоновой музыки, эффект звучит разово и точно в момент действия — это звуковая обратная связь игроку. Один звук часто переиспользуют для многих одинаковых событий.
✗ «Звуки в игре — это музыка». Нет: музыка играет фоном непрерывно, а звуковой эффект — короткий звук на конкретное событие: прыжок, монетка, выстрел.
Правило взаимодействия игрока с игрой: действие и ответ игры на него — прыгнул и перелетел яму, собрал монету и увеличил счёт. Набор механик задаёт жанр: бег и прыжки — платформер, вопросы и ответы — викторина. Изменить механику — самый сильный способ изменить игру.
✗ «Игру делает интересной красивая графика». Нет: интерес держат механики — правила действий игрока; шахматы и «Тетрис» захватывают почти без графики.
Программная платформа для создания игр: готовые подсистемы рендеринга, физики, звука и обработки ввода плюс редактор сцен. Разработчик наполняет сцены объектами и пишет скрипты поведения; движок выполняет игру кадр за кадром. Известные движки: Unity, Unreal Engine, Godot.
✗ «Каждую игру пишут с нуля». Нет: большинство игр строится на готовых движках, которые берут на себя графику, физику и звук; с нуля движки пишут редко.
Главный цикл программы-игры: пока игра запущена, она повторяет три шага — обработать ввод (клавиши, геймпад), обновить состояние мира (движение, столкновения, счёт), отрисовать кадр. Один оборот — один кадр; при 60 FPS цикл прокручивается 60 раз в секунду. Остановился цикл — игра «зависла».
✗ «Игра просто ждёт, пока игрок что-то нажмёт». Нет: игра крутит цикл десятки раз в секунду и обновляет мир постоянно, даже когда никто не трогает управление.
Средства, через которые человек управляет программой или устройством и получает ответ: экранные кнопки, меню и окна, физические кнопки и индикаторы. По сути — организованный ввод и вывод. Хороший интерфейс понятен без инструкции: элементы подписаны, важное заметно, ошибка объяснена.
✗ «Интерфейс есть только у программ на экране». Нет: интерфейс — любая «поверхность общения» человека и устройства; кнопки на пульте и панель микроволновки — тоже интерфейс.
Наименьший элемент цифрового изображения: одна ячейка прямоугольной сетки, у которой ровно один цвет. Разрешение — число пикселей по ширине и высоте (например, 1920×1080): чем их больше, тем детальнее картинка при том же размере экрана.
✗ «Пиксель — это точка определённого размера». Нет: собственного размера у пикселя нет — это наименьший элемент изображения; каким он будет на экране, зависит от самого экрана.
Число пикселей изображения или экрана по горизонтали и вертикали, записывается как 1920×1080. При одинаковом размере экрана большее разрешение означает более мелкие пиксели и детальную картинку; картинка малого разрешения на большом экране выглядит зернистой.
✗ «Чем больше экран, тем выше разрешение». Нет: разрешение — число пикселей, а не размер экрана; у маленького экрана телефона пикселей может быть больше, чем у большого телевизора.
Построение плоского изображения из описания сцены: моделей, текстур, света и камеры. Рендер реального времени (игры) обязан успевать за долю секунды и упрощает расчёты; офлайн-рендер (мультфильмы, заставки) тратит на кадр минуты и часы ради качества света и деталей.
✗ «Игра хранит готовые кадры и просто показывает их». Нет: каждый кадр рассчитывается заново из моделей, света и положения камеры — поэтому камеру в игре можно свободно крутить.
Плоское изображение-объект, которое перемещается по сцене поверх фона. В Scratch у спрайта есть костюмы (картинки для анимации), координаты и направление, а поведением управляют скрипты. Смена костюмов в цикле — готовый способ оживить героя.
✗ «Спрайт — это любая картинка в игре». Нет: фон тоже картинка, но он лежит на месте; спрайт — отдельный объект-картинка, который двигается поверх фона независимо от остальных.
Кусок игры или анимации, собранный из объектов: фона, персонажей, предметов, камеры — с точным расположением каждого. Игра состоит из сцен: меню, уровни, экран победы; при переходе одна сцена убирается с экрана и загружается следующая.
✗ «Сцена — это только фон позади героев». Нет: сцена — всё место действия целиком: фон, предметы, персонажи и то, как они расставлены друг относительно друга.
Изображение, натянутое на поверхность 3D-модели по развёртке — правилу, какая точка картинки на какое место модели попадает. Текстуры передают цвет и мелкие детали, экономя полигоны: кирпичная стена в игре — обычно плоскость с картинкой кирпичей.
✗ «Мелкие детали 3D-модели вылеплены объёмно». Нет: царапины, кирпичи и надписи обычно нарисованы на текстуре — плоской картинке, натянутой на простую модель.
Законченный отрезок игры: место действия с расставленными препятствиями, противниками и целью. Уровни выстраивают по нарастанию сложности: новый приём сначала дают попробовать в безопасном месте, потом проверяют всерьёз. Придумывает и собирает уровни дизайнер уровней.
✗ «Новый уровень — это просто когда игра становится сложнее». Нет: уровень — отдельный построенный кусок игры со своим местом, задачей и препятствиями; сложность — лишь одна из его настроек.
Упрощённая невидимая форма (прямоугольник, круг, реже многоугольник), по которой игра проверяет столкновения объектов вместо точной картинки. Простая форма считается в разы быстрее и её легко подстроить: у героя хитбокс делают чуть меньше рисунка, чтобы попадания были «честнее», а у собираемых предметов — чуть больше.
✗ «Столкновения считаются по самой картинке персонажа, пиксель в пиксель». Нет: игра проверяет попадание по упрощённой невидимой фигуре — прямоугольнику или кругу вокруг объекта.
Программа, которую выполняет видеокарта (GPU), чтобы посчитать картинку. Вершинный шейдер двигает точки модели, пиксельный (фрагментный) вычисляет цвет каждого пикселя с учётом текстуры и света. Видеокарта запускает шейдер сразу для тысяч точек параллельно, поэтому эффекты считаются быстро. Именно шейдеры дают воду, блеск металла, свечение и тени.
✗ «Шейдер — это картинка или фильтр, который накладывают на игру». Нет: шейдер — это программа, которая выполняется на видеокарте и вычисляет положение точек модели и цвет каждого пикселя.