Причины моего профессионального любопытства к теме того, как разработчики создавали в свое время игры под первую PlayStation
За последние несколько лет я на Xbox c удовольствием познакомился с ремастерами серий таких замечательных игр как Crash Bandicoot (+ Crash Team Racing), Spyro, Resident Evil, а также Quake 2 и еще нескольких. Конкретно эти игры я специально упомянул из-за того, что они в оригинале или в виде порта издавались еще на первой PlayStation (в простонародье ее называли просто "плойка"), приставке выпущенной 30 лет назад!
К чему я это? У меня, как и у многих других программистов есть немало всяких примеров в IT, которые вызывают личный профессиональный интерес и восхищение. Это могут быть например какие-нибудь крутые программы, библиотеки, системы, сайты, суперкомпьютеры, устройства на микроконтроллерах, хитрые нейросети, ретроразработка и всё прочее, что хоть как-то связано с миром удивительных компьютерных технологий. Разумеется у каждого этот список свой.
Так вот, одним из таких примеров, что пробуждает во мне профессиональное любопытство, является изучение нюансов разработки игр под легендарную первую Playstation и то как разработчики укладывались в ее технические ограничения. Далее в статье я буду рассказывать именно о причинах моего интереса к этой тематике и поэтому сразу уточню, что здесь не будет технических подробностей, максимум дам пару ссылок на дополнительный материал.
Немного ностальгии из детства
Во времена моего детства у меня, как и у большинства моих друзей, из игровых приставок (консоли тогда только так называли) была только Dendy. Реже у кого-то были и Sega MegaDrive. Это были в общем-то прикольные приставки, с неплохими двухмерными играми на картриджах, хотя было и немало фигни вида "9999 игр в 1". Всеми этими картриджами мы даже активно обменивались, что в общем-то было весело. В итоге эта Dendy для меня была куда увлекательней в плане развлечений, чем имеющийся у меня компьютер КВОРУМ-64, который даже для неприхотливого меня, был довольно сильно устаревшим.
Но в то время уже во всю расцветала эпоха трехмерных игр и поэтому неудивительно, что среди детворы особый престиж и репутацию занимала первая Playstation. Иметь такую приставку тогда считалось круто, хотя разумеется не все в то время могли себе ее позволить и для многих она была недосягаемой мечтой. Еще бы, все эти Dendy и Sega MegaDrive смотрелись блекло на фоне Playstation (аж 32-х битная!), которая открывала для нас волшебный мир крутых трехмерных игр, причем аж на дисках, прям как на серьезных персональных компьютерах. И то что у многих из нас не было этой очень желанной приставки, не мешало нам заглядываться на нее.
По телевизору в те времена у нас на Урале тогда шла классная телевизионная передача "Мегадром Агента Z" в которой в отдельной рубрике были обзоры новейших игр для этой приставки. Даже хит-парады были. Выглядело все это конечно очень тогда современно, красочно и завидно.
Но на игры Playstation мы в детстве смотрели не только в телевизионных передачах. В Екатеринбурге на ул. Вайнера когда-то в 90-е были большие ряды киосков и в некоторых из них продавались игровые диски и картриджи, книги с кодами и прохождениями, а также различные приставки среди которых почетное место занимала серенькая такая PlayStation. На витринах этих киосков красовались бесчисленные игровые диски в коробочках с крутыми обложками, а внутри киоска постоянно кто-то играл на этой самой PlayStation, причем зачастую в Mortal Kombat, хотя бывало и другие игры демонстрировались на радость потенциальным покупателям.
А еще я помню на ул. Ленина был какой-то кинотеатр Искра (вход вроде был там же где сейчас Коляда-театр) и где-то там в фойе была возможность поиграть в первую PlayStation на небольшом телевизоре с поминутной оплатой. Конечно помимо игроков было много зрителей, которые приходили просто посмотреть как другие играют. Я тогда помню, оплатил за какое-то жалкое количество минут, сел и мне запустили Duke Nukem 3D, но т.к. никто тогда не объяснил как этим чудо джойстиком управлять, то я пытаясь самостоятельно разобраться с управлением как-то умудрился в игре повернуть взгляд наверх. Совсем не понимая, как мне вернуть вид обратно я так и бегал смотря наверх и лихорадочно пытался стрелять там хоть куда-то, а куча народу позади меня молча на это смотрели и видимо тоже думали, что так и должно быть. Через несколько минут продавщица увидела это и видимо пожалев меня, нажала на какую-то кнопку на джойстике и взгляд моего героя в игре снова устремился вперед. Но после этого я недолго смог поиграть, поскольку минут я оплатил немного и большую часть времени уже потратил на это диковинное для меня управление. В каком году это было точно не помню, только это была вторая половина 90-х и при этом компьютерные клубы еще не были широко распространены.
В то время меня еще особо впечатляла игра Crash Bandicoot, у которой главный герой был фактически маскотом первой Playstation и постоянно ассоциировался с этой приставкой. В детстве я думал что там главный герой лисенок, который бегая собирал яблочки, но оказалось, что это не лисенок, а бандикут и собирал он не яблочки, а некие Вумпа фрукты. Ну откуда я в детстве мог знать, кто такой бандикут? В общем, выглядело это все очень весело и в последствии я с большим удовольствием прошел первые три части Crash Bandicoot на каком-то эмуляторе PS1.
Познавательность историй разработки игр и программ под PS1
Но что самое интересное, меня в какой-то момент стали больше интересовать не столько сами игры под PS1, сколько то, как их разрабатывали и оптимизировали под нее. Чтобы понять в чем была сложность, достаточно взглянуть на характеристики PS1 со стороны нынешней разработки:
- В качестве ЦП используется 32-битный кастомный процессор на основе бинарно-совместимой версии чипов линейки MIPS R3000A, работающий на частоте аж 33,87 МГц и который аппаратно поддерживает работу только с целочисленными значениями.
- Целых 2 мегабайта оперативной памяти.
- 1 мегабайт видеопамяти.
- MDEC для декодирования видеопотока
- Никаких жестких дисков (и соответственно никаких файлов подкачки и пр.).
- Для сохранения игр использовались специализированные карты памяти, что мало чем могло помочь для производительности в играх
- В качестве носителей данных выступал 2-х скоростной CD-ROM, с максимальной скоростью чтения 2 * 150 = 300 кб/с. Но как-вы понимаете, эта скорость чтения была при идеальных условиях и линейном чтении, а ведь надо учитывать еще и долгие задержки при чтении случайных данных на диске.
- Отдельный математический процессор GTE (Geometry Transformation Engine), который ускоряет векторные и матричные вычисления и который можно рассматривать как трехмерный ускоритель.
- Неплохая на тот момент аудиоподсистема, со своими полмегабайтами памяти.
- Помимо высокоуровневой, доступна и низкоуровневая работа с железом (например DMA различных подсистем), что позволяет раскрыть широкие возможности всего оборудования в целом, во всяком случае для тех, кто это умеет.
В настоящее время с такими ограничениями сталкиваются разве что в embedded-разработке, а в то время с этими ограничениями вынужденны были считаться не только рядовые программисты, но и и все прочие участники создания игры, такие как художники, дизайнеры, сценаристы и пр.
Тем не менее, все было не так уж плохо. В отличие от различных по характеристикам персональных компьютеров, аппаратные характеристики приставки были фиксированными и соответственно разработчики четко знали свои возможности. Плюс картинку в какой-то мере сглаживали сами ЭЛТ-телевизоры, которые были популярны в то время. Ну и в общем-то консоль имела много технических особенностей и неявных возможностей для оптимизаций и программных трюков, хотя чтобы их раскрыть, от разработчиков требовались уже куда более серьезные навыки.
Для тех кому интересны общие технические подробности, я рекомендую ознакомиться с практическим анализом архитектуры PlayStation от Rodrigo Copetti (есть перевод на русский). Там достаточно простым языком неплохо описаны технические нюансы архитектуры первой Playstation.
В общем, чем больше я изучал, тем больше очаровывался теми прикладными решениями, которые делали разработчики, чтобы выжать многое из этой приставки. Хотя и писали под данную приставку в основном на Си с использованием официальных SDK, программисты все равно имели возможность тонкого управления железом при низкоуровневом программировании, чем они активно и пользовались. Например какие-то задачи можно было распараллелить между собой за счет того, что практически все подсистемы имели прямой доступ к DMA контроллеру, хотя и не без кучи нюансов. Нередко программисты обращались к использованию Ассемблера, для более оптимального задействования возможностей ЦП. В общем для получения максимальной производительности старались задействовать все явные и неявные возможности всех подсистем приставки, причем сразу в комплексе.
Благодаря таким возможностям, разработчики активно стали использовать подходы с динамическим стримингом предварительно заготовленных текстур прямо с носителя, благодаря использованию достаточно емких компакт-дисков. Да и в общем емкость CD-ROM позволяла хранить большое количество предварительно расчитанных данных, чтобы как можно меньше задействовать ЦП для динамических вычислений.
В качестве примера того, как разработчики выкручивались, советую ознакомиться с историей разработки Crash Bandicoot, опубликованной Энди Гэвином (один из создателей этой игры и сооснователя студии-разработчика Naughty Dog). Это потрясающая история в которой в один клубок сплетены сложности арт-дизайна, технических возможностей и ограничений платформы, а также особенности индустрии развлечений тех лет.
Отдельное восхищение у меня вызывает порт Quake 2 под эту приставку. Понятно что разработчикам приходилось чем-то жертвовать, многое переделывать, а также агрессивно оптимизировать всё что только можно. Но зато порт получился достаточно качественным. И что самое удивительное, так это то, что разработчики реализовали еще и мультиплеер в виде split screen (разделение экрана) с одновременной игрой до 4-х игроков на одной приставке!
А так вообще в интернете полно информации о том, на какие хитрости разработчики шли при таких технических ограничениях. И это я говорю не про вышеперечисленные игры, а вообще про любые под PS1. Создавать красочные игры было нелегко и в ход шли не только программные трюки, но и художественные, как например туман в Silent Hill. Сейчас с этим все конечно же проще, что не так уж и плохо.
Актуальность этих знаний в настоящее время
В настоящее время такие крутые подвиги нужны достаточно нечасто. Все эти оптимизации обычно сильно усложняют код, что затрудняет его разработку и поддержку, что в свою очередь увеличивает затраты по человеко-часам и финансам. В общем браться за экстремальную оптимизацию стоит только когда затраты на нее будут явно оправданы.
Тем не менее, я не говорю что не нужно совсем оптимизировать код. Конечно нужно. Просто при этом нужно соблюдать баланс между бюджетом/сроками/требованиями и все это при очевидно ограниченных возможностях. И поэтому не удивительно что я в контексте статьи упоминал про embedded-разработку. Там экстремальные оптимизации не являются редкостью, поскольку это напрямую влияет на себестоимость изделия при массовом производстве, на ее энергоэффективность, автономность и в итоге на конкурентоспособность. В общем там это нередко оправдано.
Ну и конечно маловероятно, что потребуется где-то писать на Ассемблере под MIPS R3000A, но вот банально умение быстро разбираться в технических спецификациях может быть полезным в любых направлениях IT.
Заключение
Конечно во времена PS1 были и другие приставки под 3D игры. Но например та же вышедшая несколько позднее Nintendo 64 у нас была мало распространена и лично я вообще с ней нигде не сталкивался.
Что касается сравнения разработки игр под PS1 и embedded-разработки. Я недавно начал увлекаться разработкой под микроконтроллеры и после типичной веб-разработки, я реально в полной мере прочувствовал что такое работать в условиях жестких аппаратных ограничений по ресурсам. Со временем я стал немного больше понимать в низкоуровневом программировании и электронике в общем, хотя тут еще изучать и изучать. В общем, я вижу в этом определенный шарм, который завлекает. Хотя возможно мне просто с профессиональной точки зрения нравится, когда вычислительные ресурсы используются эффективно.