Новые чудеса оптимизации: как делали игру «Принц Персии»
easy

Новые чудеса оптимизации: как делали игру «Принц Персии»

Как сделать плавную анимацию, если доступно всего несколько кадров

Когда-то мы писали о том, как создавали и оптимизировали старые игры для приставок. Теперь взглянем на это с другой стороны: как на слабом железе создать очень интересную и визуально богатую игру. Что делать, если память почти закончилась, а нам нужны дополнительные персонажи? Ну и вообще как делали старые игры. 

👉 Эта статья — краткий пересказ видео с канала Ars Technica, где создатель игры Джордан Мехнер делится историями о разработке игры. Если знаете английский, посмотрите видео в оригинале, а если нет — читайте дальше:

Каратека

До «Принца Персии» Джордан создал «Каратеку» — игру для компьютера Apple 2. Смысл такой: игрок играет за персонажа-каратиста, который движется вперёд и сражается с другими каратистами на своём пути. Сложность разработки была в том, что у большинства пользователей Apple 2 было всего:

  • 16 килобайт оперативной памяти на всё, включая работу операционной системы и служебных программ;
  • 4-цветный монитор с разрешением 140 на 192 пикселя;
  • процессор на 1 мегагерц — это в несколько тысяч раз меньше, чем у самого простого нынешнего офисного ноутбука.

Компьютер Apple 2.
Игра «Каратека» на Apple 2.

Успех «Каратеке» принесла относительная реалистичность анимации персонажей: они довольно точно повторяли движения настоящих каратистов, и для того времени и железа это выглядело круто. 

Чтобы достичь такого эффекта, разработчики использовали тот же приём, что и аниматоры в рисованных мультфильмах: они снимали на видео движения людей в той же ситуации, потом раскладывали видео на ключевые кадры — как раз за разом меняется поза героя. Дальше они отрисовывали эти кадры на компьютере и получали довольно естественную анимацию.

Так двигается настоящий каратист.
А так это отрисовано по кадрам в «Каратеке».

Движения персонажей в «Принце Персии»

В начале работы над «Принцем Персии» у Джордана была похожая задача: нужна была анимация не просто бега или простых ударов, а полноценная механика для препятствий. Например, игрок должен уметь перепрыгнуть через ров, залезть на выступ или подлезть под воротами.

Джордан применил тот же подход, что и в «Каратеке», но вывел его на новый уровень: он позвал своего брата и попросил выполнить его все трюки, которые будут в игре у персонажа. Каждый трюк, от простого бега до длинных прыжков с разбега, Джордан снимал на камеру:

После этого он сделал то же самое, что и в «Каратеке», но с большей тщательностью: разложил каждый трюк на кадры, отрисовал их и превратил в кадры для анимации на компьютере:

Но проблема была ещё в том, что нельзя было оцифровать каждый кадр — если делать анимацию с той же раскадровкой, что и на плёнке, то понадобится много памяти, чтобы отрисовать каждое промежуточное движение. Пришлось выбирать, какие кадры из анимации выкинуть, а какие оставить. Так удалось сократить каждое движение до нескольких фреймов и сохранить реалистичность:

В работу пошли только те кадры, где изменение положения игрока было заметным на глаз

А вот что получилось в итоге после оцифровки анимации:

Как сделать ещё одного персонажа, когда не хватает памяти

Изначально в «Принце Персии» не было врагов — игрок должен был просто пройти все подземелья и ловушки, чтобы добраться до принцессы. Чтобы игра стала интереснее, разработчик решил добавить в неё противника. 

Но проблема была в том, что новому персонажу нужны:

  1. Свой уникальный внешний вид, чтобы никто не перепутал его с кем-то ещё.
  2. Своя анимация движения.
  3. Своя логика работы и реакции на то, что происходит в игре.

Это всё требует дополнительных расходов памяти, которой и так было очень мало. Несколько месяцев Джордан не знал, как подступиться к решению, пока ему не подсказали решение: сделать нового персонажа на основе старого.

Решение придумали такое: 

  1. Использовать битовую команду EOR (исключающее или), чтобы при наложении EOR-маски на модель игрока получить её контур — цветной по краям и чёрный внутри.
  2. Так как это просто маска, которая накладывается на модель игрока, то новую анимацию придумывать не нужно — достаточно будет на неё наложить ту же маску.

Во время разработки это выглядело так и заняло всего 4 команды:

Глядя на результат, разработчик понял, что у него получился как бы теневой двойник главного героя. Чтобы объяснить его внешний вид, Джордану пришлось придумать целую историю прохождения игрока через зеркало: в тот момент, когда герой проходит сквозь зеркало, с обратной стороны выходит тот самый теневой персонаж:

Чему это нас учит

По классике, «раньше программисты могли написать игру на 3 килобайта, и она игралась лучше, чем современные поделки». Но это старая сказка, так будут говорить всегда. 

Интересно вот что: большая часть решений в этой игре — не программистская, а смысловая и художественная. На основании чего записать движения? Какие кадры выбрать? Что должно быть в сюжете? Это история о том, что программирование — это не столько знание синтаксиса, сколько решение творческих задач. 

И, конечно, волшебный приём с исключающим «или» — у машин есть классные низкоуровневые команды, зная которые мы можем добиваться высокой производительности и интересных эффектов. Кто хорошо понимает компьютеры, тот может выжимать из них больше. 

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Алина Грызлова

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Вам может быть интересно
easy
[anycomment]
Exit mobile version