Categories
*.BAK PC Gaming

О Кармаке

Давеча опять всплыла тема о том, как умненький Кармак всех перехитрил и сумел сделать плавный scrolling на ПеКа. Якобы никому до этого такое не удавалось, ибо Nintendo рвенно хранила секрет, как этого достичь в Mario. А Кармак взял да этот секрет поведал всему миру, безвозмездно. Такой вот классный парень этот Кармак.
Понятное дело, что миф этот сам же Кармак и раздул. Будучи посредственным программистом (другие в те времена в написание игр не шли), Кармак, тем не менее, всегда был силен в PR. Потому все, кто пересказывает этот миф цитируют “книгу” Masters of Doom. Книга же соврать не может.

Давайте все же разберемся, в чем же заключалась проблема Nintendo и ее решение. Которое Кармак как некий Прометей похитил и раздал людям.
А проблема заключалась в том, что консольки – продукт массовый. И как любой массовый продукт, маржи они сами по себе не несут. Значит необходимо сделать консоль как можно дешевле. А какая самая дорогая часть консоли? Гуманитарии было подумают, что это корпус. Или в крайнем случае CPU. На деле же, самой дорогой частью консоли до недавнего времени оставалась оперативка. Соответственно чтобы хоть как то выйти на массовый рынок и начать наконец то стричь лоха, производителям консоли нужно было память экономить. Потому у NES этой памяти было 2KB.
Понятное дело, что в 2KB много не нарендеришь. Потому использовался трюк знакомый любому написать ХаТэМэЛэ: sprite. Мелких картинок много, таскать тяжело? Слепим всю в одну, и будем указывать только offset’ы. У NES с этим все было ещё строже, и картинки были всегда 16×16. С дискретными шагами могли справиться даже японские “программисты”, которых как лепили из инженеров электроники, так и лепят.
Это все хорошо, но почему у Кармака было всего 2KB? Лезем читать про EGA: а там 256KB. Правда ПеКа – архитектура своеобразная. Ему вообще плевать что выводить на экран. Лучше всего конечно выводить текстовой редактор. Но и кадр из игры вполне можно засунуть. Но для того, чтобы плавно продвинуть картину на 1px, нужно побольше памяти. Лучше всего 512KB, чтобы умещалось сразу два экрана. К счастью, ПеКа уже в те времена покупались с запасом. Так что гениальный Кармак просто рисовал два экрана вместо одного.

Проблема с таким подходом в том, что тупо два экрана за tick не отрисовать, шина не позволит. Тогда было “изобретено” другое гениальное решение, знакомое в наши дни любому индусу наложившему свои лапки на Unity: писать только ту часть, которая поменялась. Субматрицы кажись подходят в CS101.
Такая вот прущая из всех щелей гениальность.