Полезно время от времени проводить ретроспективу и обращаться к прошлому, чтобы лучше понять, как мы получили то, что имеем сейчас. И эта статья написана именно с такой целью. Она представляет собой краткий обзор истории игровых консолей: как эволюционировали технологии и какие ограничения преодолевали для того, чтобы оказаться в той точке, в которой современные игровые консоли находятся сейчас.
Мы рассмотрим устройство некоторых старых технологий, легших в основу игровых консолей, попытаемся понять их ограничения и рассмотреть все это в исторической перспективе. И начнем с самых первых поколений — окунемся в историю аж на 50 лет назад.
Поколения игровых консолей
Наверняка вы уже знаете, что консоли делятся на поколения. Как правило, эти поколения сменяются примерно раз в пять лет: такое разделение связано с конкуренцией на рынке и развитием технологий.
Давайте начнем с очень краткого обзора в обратном направлении, от новейшего к старейшему. А после этого перейдем к более подробному описанию каждого поколения и основных технологий, лежащих в их основе.
9-е поколение: Оно случилось буквально всего ничего, пару лет назад — так что PS5 и Xbox Series X/S, считай, только начинают прокладывать себе путь к конечному пользователю (чему никак не способствует дефицит железа).
8-е поколение: Оно тоже еще не закончилось и вряд ли потеряет свою актуальность в ближайшем будущем. Основными его представителями являются PS4, Xbox One, Wii U и Nintendo Switch. Именно это поколение ответственно за значительное повышение частоты кадров и популяризацию игр с разрешением 4K.
7-е поколение: Это поколение PS3, Xbox 360 и оригинальной Wii. Именно тогда произошел переход к активному использованию онлайн-сторов и загрузке контента как неотъемлемой части новых игр, а также случилось новое поколение игр для Wii с управлением движением.
6-е поколение: Шестое поколение ознаменовалось тем, что PS2 стала самой продаваемой консолью в истории, Sega выбыла из соревнования после выпуска Dreamcast, а Microsoft вышла на рынок консолей с оригинальной Xbox. Это поколение первое сосредоточилось на том, чтобы сделать консоли неотъемлемой частью любого дома, чему способствовало использование DVD-дисков как носителей и HD-разрешения.
5-е поколение: Именно тогда Sony вышла на рынок домашних консолей с оригинальной PlayStation. Конкуренцию ей составляли Nintendo 64 и Sega Saturn. Это поколение ознаменовалось переходом от 32 бит к 64 битам, а также огромной волной 3D-игр для консолей со специальным оборудованием для полигонального рендеринга.
4-е поколение: 4-ое поколение охарактеризовалось лавиной 16-битных игр, появившихся с выходом SNES от Nintendo и Sega Genesis (Mega Drive). Именно оно подарило консолям аудиовизуальное качество лучших аркадных автоматов, а также воплотило в сознании публики знаменитые талисманы компаний: Соника (Sega) и Марио (Nintendo).
3-е поколение: Это поколение известно как 8-битное — благодаря таким консолям, как NES (Nintendo Entertainment System) и Sega Master System. То была эра красочной графики, которая помогла донести изобретательный японский геймдизайн до широких масс.
2-е поколение: Поколение игровых картриджей. Самая известная консоль той эпохи — Atari 2600 VCS. За ней следом — Intellivision и менее известная Fairchild Channel F. Именно начиная с этого поколения на одной консоли стало возможным запускать несколько игр.
1-е поколение: В этом поколении каждая консоль была предназначена только для одной или двух игр, предварительно встроенных в ее аппаратное обеспечение. Так, первой домашней консолью стала Magnavox Odyssey, за которой последовали Pong и целая волна ее клонов.
Ну а теперь, чтобы лучше разобраться в эволюции технологий, пойдем уже в противоположном порядке. Давайте начнем с самого первого поколения консолей, а дальше по нарастающей. И рассмотрим каждое из них глазами программиста, обращая пристальное внимание на аппаратные и программные ограничения устройств.
И начнем мы с того поколения, когда еще одна машина должна была отвечать за исполнение одной и только одной игры.
Первое поколение (1972-1980): Одна консоль — одна игра
Привычным нам домашним консолям предшествовали громоздкие аркадные автоматы с одной игрой, встроенной в само железо. Pong — как раз одна из самых ранних таких игр. Ее разработал Аллан Алькорн в качестве тренировочного проекта по заказу соучредителя Atari Нолана Бушнелла, но вся команда была настолько потрясена качеством работы Алкорна, что в итоге ее запустили в производство.
Впоследствии такие аркадные автоматы логично захотели донести до домов людей, и мы получили специальные небольшие консоли с одной или двумя играми, встроенными в железо. Но даже в случае тех консолей, которые подразумевали запуск более чем одной игры, для ее смены нужно было задействовать физический переключатель на задней панели.
Magnavox Odyssey, выпущенная в сентябре 1972 года, стала фактически первой домашней консолью. Первоначально она строилась на полупроводниковых микросхемах, но затем Magnavox перешла на более дешевые интегральные аналоги.
Устройство этих первых консолей было совсем простым. Odyssey могла отображать на экране три квадратные точки и одну линию в монохромном черно-белом режиме, чье поведение можно меняться в зависимости от хода игры.
Пользователи Odyssey могли перемещать точки с помощью контроллеров, а для придания более «причудливых» визуальных эффектов игры включали в себя пластиковые накладки, которые можно было наклеивать на экран телевизора с помощью статического прилипания. Например, такие цветные накладки могли представлять сообй препятствия, которые точки должны избегать, или линии, по которым они должны следовать.
Аркадную Pong Atari выпустила в ноябре 1972 года, а к Рождеству 1975 — ее домашний аналог в партнерстве с Sears. Эта приставка обладала рядом преимуществ по сравнению с Odyssey, включая встроенный звуковой чип и возможность отслеживать счет игры.
К 1977 году рынок консолей пополнился множеством сторонних производителей, которые в основном просто копировали Pong или другие популярные игры. Все это привело к перенасыщению рынка, когда на выбор потребителю предлагалось несколько сотен различных консолей, качество которых оставляло желать лучшего. Все это в результате привело к его обвалу.
Кроме того, становилось ясно, что каждый раз создавать новую консоль для каждой новой игры не выход, и компании должны найти более дешевый способ распространения игр.
Второе поколение (1976-1992): Эра картриджей
Второе поколение игровых консолей охарактеризовалось появлением картриджей. При таком способе распространения игр код каждой игры хранится внутри этих самых картриджей с помощью микросхем памяти только для чтения (ПЗУ).
Когда мы вставляем новый картридж, консоль получает прямой доступ к коду игры, который хранится в ПЗУ картриджа, так что необходимость предварительно загружать код в память отпадает. В результате содержимое ПЗУ отображается в основной памяти консоли. Такой подход намного быстрее, чем другие альтернативы хранения данных того времени, такие как кассеты или дискеты.
Основными консолями этого поколения стали Fairchild Channel F, Atari 2600 VCS и Intellivision. Среди них Atari 2600 VCS оказалась самой популярной: именно она поспособствовала популяризации игровых картриджей как основного носителя для хранения игр.
Создание игр для таких консолей оказывалось не самой простой задачей: Atari VCS имела медленный процессор 1,19 МГц, 128 байт оперативной памяти и всего 4 КБ ПЗУ для хранения кода игры. Вся игра, включая логику, графику, спрайты, растровые шаблоны и все игровые данные, должна была уместиться менее чем в 4 кБ ПЗУ. Да любое PNG-изображение в этой статье больше 4 кБ — а значит, больше любой игры, в которую можно было поиграть на Atari 2600. Впрочем, позднее с целью увеличения размера ПЗУ некоторые программисты стали использовать технику, называемую переключением банков (bank-switching).
Архитектура таких консолей была самой элементарной: схемы Atari 2600 можно было запросто нарисовать от руки. Также наверняка вы не раз слышали, что при программировании для Atari VCS приходилось «гонять луч» по экрану (race the beam). Это означает, что необходимо было засекать тактовые циклы каждой команды процессора и сопоставлять их со временем, необходимым для отображения объектов на ЭЛТ-дисплее. Каждая команда процессора должна следовать за лучом, несущим в себе команду о том, что должно быть отображено в реальном времени.
TIA — это кастомная микросхема, генерирующая видеовыход для VCS. Чип был спроектирован таким образом, чтобы не иметь буфера кадров, вместо этого полагаясь на центральный процессор, который посылал правильные сигналы и точно распределял их по времени для отображения объектов на экране.
И прежде, чем мы закончим со вторым поколением консолей, стоит упомянуть еще кое-что, крайне важное с точки зрения их истории. Когда Atari рассматривала разные варианты процессора для VCS, Intel, Motorola и MOS на почве этого устроили между собой настоящую ценовую войну. MOS оказалась единственной компанией, назначившей цену, которую была готова заплатить Atari. Это событие предопределило значение в истории технологий сверхзнаменитого семейства процессоров, известного как 6502.
6502 использовался в нескольких игровых приставках и микрокомпьютерах, так что большинству программистов 70-х и 80-х годов так или иначе хоть раз приходилось писать код для какого-либо из типов процессора 6502. Помимо Atari 2600, он использовался в таких консолях, как Nintendo Entertainment System (NES), Commodore VIC-20, Commodore 64, Apple II, Tamagotchi и еще многих и многих других.
Третье поколение (1983-2003): 8-битное поколение
После краха рынка видеоигр в 1983 году США потеряли интерес к консольным играм в пользу персональных компьютеров — так что третье поколение консолей стало ответственно за то, чтобы вернуть популярность видеоиграм в Америке.
Устройства этого поколения использовали 8-битные процессоры, что позволило программистам расширить границы возможного в плане графики и звука. Красочные спрайты и тайлы — все это подарило японским устройствам известность во всем мире. Самыми популярными консолями этого поколения стали NES, Sega SG-1000 и Sega Master System. При этом изначально Nintendo выпустила свою консоль под названием Family Computer (или Famicom) в Японии, но в Северной Америке изменила название на NES, чтобы избежать ассоциации с нон-грата термином «видеоигра».
Такие консоли позволяли создавать куда более интересную графику, чем поколением ранее. Теперь в распоряжении программистов было до 5 бит для цвета (2⁵ = 32 различных цвета), пять звуковых каналов и другие более продвинутые эффекты. Например, NES могла обрабатывать набор спрайтов и тайлов с помощью специального блока обработки изображений (picture processing unit).
PPU генерировал видеовыход для NES, работая на частоте в 3 раза выше, чем CPU (каждый цикл PPU выводит один пиксель при рендеринге). С помощью него можно было выводить фоновый слой и до 64 спрайтов размером 8x8 либо 8x16 пикселей, которые определялись в «таблицах шаблонов» в ПЗУ картриджа. Фон можно было прокручивать по осям X и Y, в том числе с помощью «тонкой» прокрутки (по одному пикселю за раз).
Как работает графика на NES, так просто в двух словах уже не изложишь. Но что действительно важно отметить — этак это то, что работать с тайлами и спрайтами оказалось намного проще, чем кодировать необработанные блоки растровой графики в ПЗУ, как это делали с VCS в предыдущем поколении. PPU (блок обработки изображений) теперь занимался графической частью игр NES, а APU (блок обработки звука) — звуковой.
Процессором NES оказался Ricoh 2A03 на базе 6502. И практически все известные игры для NES написаны на языке ассемблера 6502.
Низкая скорость работы процессора (1,79 МГц на NES) приводила к тому, что при разработке каждый такт имел решающее значение. Зачастую программисты NES просто выучивали наизусть, сколько тактов занимает каждая команда процессора: подсчет тактов для каждой строки ассемблерного кода 6502 был в по время очень распространенной практикой.
Однако, учитывая, что язык программирования C уже тогда набирал популярность в мире ПК, разве не было логично использовать для написания игр для NES? Ведь язык C был по сути «переносным ассемблером» — то есть, имея компилятор C, умеющий генерировать скомпилированный код MOS 6502, теоретически можно было писать игры на C вместо того, чтобы делать это на ассемблере 6502.
Конечно, в то время существовало несколько компиляторов C, которые были в состоянии генерировать код 6502 для NES. Но, к сожалению, скомпилированный код был слишком медленным, чтобы этот способ разработки игр оказывался жизнеспособным. Так что для программистов NES того времени не было другого варианта, кроме как писать игры на ассемблере 6502 самим.
Однако — технологии развиваются. И для создания лучшей графики и более сложного геймплея следующее поколение должно было снова поднять планку.
Четвертое поколение (1987-2004): 16-битное поколение
Большинство консолей четвертого поколения были именно 16-битными — или, иными словами, регистры внутри их процессоров могли хранить и манипулировать уже 16-битными данными. Помимо более быстрой тактовой частоты процессора, среди их преимуществ была возможность обращаться к экспоненциально большему количеству адресов памяти, чем предыдущее поколение. Все это для консолей означало две важные вещи: лучшую графику и лучшее качество звука.
При этом, как ни странно, самая первая консоль 4-го поколения — NEC TurboGrafx-16 — работала все еще на 8-битном процессоре. Это Nintendo и Sega вступили в гонку уже со своими консолями SNES и Sega Genesis, которые были по-настоящему 16-битными.
Но погодите: NEC TurboGrafx-16 имел 8-битный процессор, но при этом все равно смог конкурировать с более мощными 16-битными консолями? Как так?
А вот так.
TurboGrafx-16
Итак, ядром своей консоли TurboGrafx-16. Это 8-битный процессор, работающий на впечатляющей по тем меркам частоте 7,6 МГц. Для сравнения: 16-битный процессор SNES работал на каких-то 3,6 МГц.
Nintendo пришлось ограничить тактовую частоту процессора SNES до 3,6 МГц из-за решения использовать медленные чипы ОЗУ и ПЗУ — ведь на самом деле не имеет значения, насколько быстрый у вас процессор, если медленная скорость оперативной памяти всегда будет узким местом в производительности машины.
Этот компромисс между скоростью работы процессора и оперативной памяти актуальна и по сей день. Большинство людей мыслят о производительности только в терминах тактовой частоты процессора, но поскольку природа большинства программ заключается в постоянном чтении и записи значений из памяти, важно сочетать скорость работы процессора со скоростью оперативной памяти. Именно поэтому поэтому два года назад Apple решила создать свой чип M1 с ОЗУ, расположенным аккурат по соседству со схемой процессора и обеспечивающим прямой доступ к памяти.
Таким образом, NEC удалось конкурировать на 16-битном рынке, используя быстрый 8-битный процессор и в совокупности с быстрыми же чипами ОЗУ и ПЗУ.
Кроме того, TurboGrafx-16 использовал также мощный 16-битный графический чип, и это тоже немало поспособствовало тому, что NEC начала рекламировать TurboGrafx-16 как «16-битную консоль».
SNES
Многие помнят SNES как самую мощную консоль своего поколения, хотя и не совсем так. Скорее всего, дело в ее превосходном графическом PPU, который был способен на некоторые очень интересные графические эффекты. Так, программисты SNES имели доступ к восьми видеорежимам, включая знаменитый Mode 7, позволяющий изменять фоновый слой с помощью матричных преобразований. Если вы когда-нибудь играли в Super Mario Kart или Pilot Wings — их 3D-эффекты создавались как раз с помощью Mode 7.
16-битный процессор SNES строился на базе архитектуры 6502. Именно из-за его особенностей, а также отсутствия регистров и нагрузок, создаваемых многими компиляторами языка C того времени, большинство игр для SNES программировались с помощью ассемблера 6502.
Genesis (Mega Drive)
Sega, в свою очередь, решила использовать более мощный процессор для Genesis: Motorola 68000 работал на частоте 7,6 МГц (в два раза быстрее, чем SNES) и был гибридным 16/32-битным процессором. В то время 68000 был крайне популярным и использовался в том числе в таких микрокомпьютерах, как Commodore Amiga и оригинальный Apple Macintosh.
Именно начиная с этой консоли особенно заметны подвижки в способах разработки игр. Большая аппаратная мощность Genesis означала, что некоторые игры (или, по крайней мере, их части) теперь можно было писать на C.
Даже несмотря на то, что ассемблер 68000 многие считают одним из самых удобных языков, появившаяся возможность писать фрагменты кода на языке высокого уровня стало огромным преимуществом для Genesis. Компиляторы C становились все быстрее и лучше, и выдавали на выходе оптимизированный скомпилированный код. Поэтому для следующего поколения консолей C и стал наиболее предпочтительным.
Fun fact: Хотя Sega Genesis не имела такого мощного графического процессора, как SNES, 68000 позволял играм Genesis создавать эффекты, схожие с эффектами Mode 7, но при помощи ПО.
Еще одна наверняка очевидная вещь заключается в том, что использование одного лишь центрального процессора для перемещения пикселей не подходит. Вы заметили, что большинство консолей предпочитают иметь выделенный графический блок, работающий вместе с процессором? Особую популярность это наберет в следующих поколениях — справедливо оно и для современных игровых устройств, имеющих свой выделенный графический блок (или видеокарту).
К концу 4-го поколения для улучшения графических возможностей игр Nintendo использовала специальные разогнанные сопроцессоры, встроенные в игровой картридж. Самым известным таким примером является чип Super FX. Он был разработан компанией Argonaut Games, также совместно с Nintendo выпустившей игру Star Fox для демонстрации возможностей чипа по рендерингу дополнительных полигонов.
Super FX представлял собой RISC-сопроцессор, обычно программируемый как графический ускоритель для отрисовки полигонов в кадровый буфер в расположенной рядом с ним оперативной памяти. Для отображения на экране данные в этом кадровом буфере периодически передавались в основную видеопамять внутри консоли, связанную с ним напрямую.
Fun fact: Во время разработки Super FX носил кодовое название MARIO chip, а его инициалы расшифровывались как “Mathematical, Argonaut, Rotation, & Input/Output”.
Также в то время существовал чип Super FX 2, представляющий собой более быстрый эквивалент Super FX, работавший на впечатляющей частоте 21,4 МГц. Особенно хорошо раскрывала его возможности игра Star Fox 2.
И еще немного о 3D-играх для SNES напоследок: многие уверены, что в Donkey Kong Country были классные 3D-объекты с освещением и тенями, насколько хорошо они выглядели. Так что же, разве они не используют 3D-полигоны в реальном времени?
Не совсем. Разработчики Donkey Kong Country купили супер-дорогую станцию Silicon Graphics для моделирования 3D-объектов в игре, но по итогу просто использовали предварительно отрендеренные 2D-спрайты этих 3D-моделей.
Поэтому, когда мы играем в Donkey Kong Country на SNES, то, что мы видим, — это просто серия предварительно отрендеренных 2D-изображений, создающих эффект 3D-игры.
Пока на этом все. В следующий раз мы перейдем уже к поколениям последних лет и поговорим о становлении тех лидеров консолей, которые и сейчас сохраняют свои позиции: как PS2 стала самой популярной консолью своего времени, в то время как Microsoft со своим Xbox только зашла на рынок, а также обо всем, что происходило после этого и вплоть до наших дней.
Комментарии (5)
Alexey2005
21.01.2022 16:51+1Крутость NES с точки зрения программиста ещё и в том, что это полностью детерминированная система. Настолько, что можно рассчитать с точностью до такта время выполнения того или иного участка кода — и он абсолютно везде будет выполняться именно такое время! Никаких побочных эффектов, никаких внешних воздействий, единственный источник энтропии — действия пользователя.
Программировать подобную систему — настоящий кайф в отличие от современного программирования игр, которое чуть ли не целиком состоит из преодоления разного рода побочных эффектов от взаимодействия игры с посторонним кодом и разношёрстными компонентами железа, где программист не знает и не может знать, что происходит в фоне во время работы его кода.в Donkey Kong Country были классные 3D-объекты с освещением и тенями, насколько хорошо они выглядели.
Возможно, вкусовщина, но лично я всегда ненавидел «сеговскую» мутную графику которая выглядела откровенно мыльной и малоконтрастной на фоне чёткой NES-графики. Да вот даже взгляните на gif'ку с Donkey Kong из статьи: спрайты, сливающиеся с фоном, тусклые цвета фона и МЫЛО! Много грёбаного мыла, которое с этих самых времён на два десятилетия становится визитной карточкой любой консоли. Игроки на эту тему насочиняли множество анекдотов и приколовпример— Ух ты, гляди! На таком слабом железе — и вдруг Дрейк!
— Так вот и я думаю, что без мыла он бы сюда не влез…
shiru8bit
21.01.2022 18:46+1Пример обратной вкусовщины. Году в 1996 я впервые увидел вживую и вблизи SNES и Donkey Kong. Она была подключена через композит к телевизору Sharp, и самое яркое моё впечатление было в том, что я впервые увидел очень чётко очерченные пиксели, ну и очень яркие цвета. Но тогда мне это не понравилось, выглядело как-то слишком квадратно после привычной мутной картинки на Денди и Сеге на отечественных телевизорах (ладно хоть с PAL-кодерами).
На Денди пиксели обычно вообще не разглядеть, там из-за особенностей конструкции всегда муар, плывующие диагональные линии по всем цветными пикселям (а в оригинальной NES - т.н. dot crawl, аналогичный артефакт). На Сеге горизонтальное разрешение повыше, и видимо для телевизоров тех лет этого было достаточно, чтобы скрыть явные границы пикселей.
Чистые идеальные пиксели я полюбил уже во времена эмуляторов, хотя надо заметить, что иногда идеализированная картинка искажает авторскую задумку (когда автор хотел, чтобы всё сливалось в кашу, и воображение видело в ней детализацию).
horror_x
21.01.2022 18:16+1При этом изначально Nintendo выпустила свою консоль под названием Family Computer (или Famicom) в Японии, но в Северной Америке изменила название на NES, чтобы избежать ассоциации с нон-грата термином «видеоигра».
А где в «Family Computer» связь с термином «видеоигра»?68000 позволял играм Genesis создавать эффекты, схожие с эффектами Mode 7, но при помощи ПО
Звучит как будто там софтверный рендеринг. Это не так. Просто с помощью прерываний и других уловок в процессе отрисовки строк менялись смещения фона и т.п., что давало эффект параллакса или 3D. Т.е. это скорей аппаратная возможность.shiru8bit
21.01.2022 18:50Почти все эффекты, которые имеются в виду - растровые, т.е. основанные на изменении цвета или смещения строк кажду строку растра. Они точно так же доступны и на SNES, только на Сеге надо производить манипуляции в обработчике строчного прерывания, а на SNES есть специальные списки изменений параметров (т.н. HDMA), которые позволяют делать то же самое чуть-чуть проще. Но и строчные прерывания никто не отменял. И перспектива в Mode 7 - это тоже на самом деле растровый эффект, каждую строку меняется поворот и увеличение слоя фона. Принципиальная разница в том, что у SNES есть один видеорежим с вращением и увеличением (тот самый Mode 7), а у Сеги нет, ну и побольше цветовая палитра, в остальном возможности плюс-минус одинаковые.
shiru8bit
Уже лет десять как пишут игры для NES на C, десятки их, причём сам компилятор родом из 1989 года. И скорость выполнения скомпилированного кода на платформе с полностью аппаратной графикой не такая уж большая проблема, больше проблем с размещением этого кода (он занимает в разы больше места). То есть вполне было возможно писать на C ещё во времена коммерческой жизни платформы, но это были как раз годы перехода на 16-битные платформы, и регулярная практика программирования на ЯВУ установилась уже там. И вероятно сыграло роль то, что даже в начале 16-битной эпохи место на картридже старались максимально экономить, т.к. чем больше ПЗУ - тем выше себестоимость одной копии. Потом цены на память снизились, и увеличенный объём ПЗУ использовался как маркетинговая фишка (надписи 8-16-24 мегабит на картриджах для Sega Genesis, для пользователя больше мегабит = лучше графика).