Как ретроконсоли обрабатывали графику до появления современных графических процессоров?
Графические чипы умели рисовать, но не вычислять — так было до появления Xbox.
Более двух десятилетий графику в консолях создавали специализированные чипы с фиксированными функциями — пока в 2001 году на сцене не появилась первая Xbox со встроенным графическим процессором для ПК. Те, кто играл на ранних консолях вроде NES, наверняка сталкивались со знакомыми особенностями таких чипов: например, когда в одном ряду в Super Mario Bros. выстраивалось слишком много гумб, некоторые из них начинали мерцать. Так проявлялось жёсткое ограничение графического чипа NES — не более восьми спрайтов на строку развёртки: всё, что превышало этот предел, чип отбрасывал, а игра поочерёдно показывала разные спрайты.
В NES за отрисовку игровой графики отвечал блок обработки изображения Ricoh 2C02. Это был довольно примитивный чип, который не мог выполнять код. Вместо этого он брал изображения тайлов с картриджа и несколько таблиц поиска из памяти и превращал их в телевизионный сигнал — по одной строке развёртки за раз. Такая схема — отдельный генератор изображения, которым управляет центральный процессор, — использовалась в большинстве консолей с конца 1970-х до 2000-х годов.
Когда в ноябре 2001 года вышла первая консоль Microsoft, Xbox, она совсем не походила на предшественников. В её основе лежали процессор Intel Pentium III и специально созданный для неё графический чип NVIDIA на базе GeForce 3. О GeForce 3 объявили всего несколькими месяцами ранее, в феврале, и это был первый графический процессор, позволивший разработчикам программировать собственные пиксельные и вершинные шейдеры.
Чип Ricoh 2C02 в NES работал примерно с 10 КБ памяти. Около 8 КБ занимали изображения тайлов, хранившиеся на картридже, а ещё 2 КБ оперативной памяти в консоли использовались для хранения одной или двух карт фона. В отдельных небольших блоках памяти внутри чипа отслеживались такие параметры, как положение, форма и ориентация до 64 спрайтов. Изображение имело разрешение 256 × 240 пикселей и состояло из тайлов размером 8 × 8 пикселей.
Пока электронный луч ЭЛТ-телевизора проходил по строкам экрана, 2C02 определял, какой тайл размером 8 × 8 пикселей должен находиться в каждой точке. Затем чип сверялся со спрайтами, расположенными на этой строке, и решал, какой пиксель показать. Всё это происходило синхронно с движением луча, поэтому центральный процессор не мог безопасно перезаписывать изображение во время его отрисовки.
В отличие от NES, в более ранней Atari 2600 за графику отвечал сам центральный процессор. Поскольку в её адаптере телевизионного интерфейса не было кадрового буфера, процессору приходилось передавать чипу новые значения для каждой строки развёртки, которую рисовал луч. Всего пятью годами ранее, в 1972 году, у Magnavox Odyssey не было ни процессора, ни памяти: точки и линии она выводила с помощью отдельных диодно-транзисторных логических схем. Все эти машины создавались для ЭЛТ-дисплеев — отчасти поэтому ретроигры лучше выглядят на старых ЭЛТ-телевизорах.
В марте 1999 года Sony представила чипы PS2. Центральным процессором была Emotion Engine — 128-разрядная разработка Sony и Toshiba, а за графику отвечал отдельный чип под названием Graphics Synthesizer. В серийных консолях их частоты составляли примерно 295 и 147 МГц соответственно.
Однако Graphics Synthesizer не обрабатывал геометрию. К тому времени, когда треугольник попадал к нему, он уже был размещён в кадре, и чипу оставалось лишь залить его цветом и текстурой. Геометрические вычисления выполнялись на Emotion Engine — двумя векторными блоками. Центральный процессор мог поручать VU0 различные мелкие задачи, а VU1 в основном выполнял трёхмерные преобразования, превращавшие модели игры в треугольники на экране. Инженеры Sony и Toshiba утверждали, что один векторный блок способен выполнять 85 миллионов таких преобразований в секунду. Хотя все консоли были разными, многие ранние трёхмерные модели также распределяли графическую нагрузку между несколькими чипами.
Любопытно, что Sony использовала термин GPU для графического чипа Toshiba в PlayStation 1994 года. Это произошло за пять лет до того, как NVIDIA назвала GeForce 256 первым в мире GPU. Однако современное определение GPU — чипа, выполняющего небольшие программы, написанные для игры, — появилось только с выходом GeForce 3 в начале 2001 года.
NVIDIA и Microsoft заключили соглашение о разработке Xbox в марте 2000 года, а пять дней спустя Билл Гейтс вышел на сцену и объявил о создании консоли. В ней должны были использоваться процессор класса Intel Pentium III, специально разработанный графический процессор NVIDIA, общая для них 64 МБ памяти и жёсткий диск на 8 ГБ. Готовую консоль представили на выставке CES 2001, а в продажу она поступила в ноябре того же года.
Но переход консолей на аппаратное обеспечение, характерное для ПК, произошёл не одномоментно. В том же месяце вышла Nintendo GameCube с процессором PowerPC от IBM, и в течение следующего десятилетия его использовали все ведущие консоли: в 2005 году Xbox 360 сменила Intel на три ядра PowerPC от IBM, чип Cell в PS3 Sony, Toshiba и IBM создали на основе ядра PowerPC, а Wii и Wii U работали на обновлённых версиях чипа IBM из GameCube.
Графическая часть уже перешла на решения в духе ПК: в Xbox 360 стоял чип ATI, а в PS3 — NVIDIA. Но процессоры оставались прежними. Всё изменилось в 2013 году, когда PS4 перешла на восемь процессорных ядер AMD и графическую архитектуру, использовавшуюся в видеокартах AMD Radeon для ПК. Современные PS5 и Xbox Series X работают на восьми ядрах AMD Zen 2 и графике AMD RDNA 2, размещённых на одном чипе с центральным процессором. В конечном счёте разрабатывать графические чипы для консолей с нуля перестало иметь смысл, когда готовые архитектуры GPU стали укладываться в консольный бюджет.