Джон Кармак, заедно със своя съименник Джон Ромеро, са пионерите

...
Джон Кармак, заедно със своя съименник Джон Ромеро, са пионерите
Коментари Харесай

Най-добрите програмисти на века: Джон Кармак и неговите геймърски енджини

Джон Кармак, дружно със своя адаш Джон Ромеро, са пионерите в жанра на FPS игрите. На слаб компютър с процесор 486SX, без графични карти (!), те сътвориха 3D шутър без лагове и с резултат на наличие, който през 1993 година, в ерата на походовата тактика и неналичието на скролване, се трансформира в същинска бомба. Изглежда, че тук се е намесила някаква черна магия…

По принцип това в действителност е по този начин. При създаването на Wolfenstein 3D, Doom и енджина на Quake Джон Кармак в действителност употребява куп неконвенционални трикове като превръщане на указателите и излизане отвън границите на обектите, с цел да може в циклите да получи достъп до различен обект, който сигурно следва първия.

Нивото на програмиране на Doom и Quake и до през днешния ден се смята за най-съвършения модел на хакерска оптимизация, а самият Джон Кармак е пример за свръхефективен разработчик. Благодарение на отличното качество на програмирането Doom се трансформира във феномен, който промени света.

Проектите

За да разберем равнището на легендарност на Джон Кармак, е задоволително да погледнем листата му с разработки, който включва 41 игри, оповестени сред 1990 и 2012 година

Ето няколко образеца:

Slordax, 1990 година, първото използване на side-scrolling (странично превъртане) в компютърните игри Wolfenstein 3D, 1992 година, мапинг на текстури Doom, 1993 година, BSP дървета (за това по-долу), отвод от музиката в интерес на околния игрови звук (идея на Кармак) Doom II, 1994 г Heretic, 1994 г Hexen: Beyond Heretic, 1995 г Quake, 1996 г Quake II, 1997 г Quake III Arena, 1999 г Принос в редица планове с отворен код, в това число първия порт на X Window System на Mac OS X Server и плана Utah GLX за завършване на OpenGL драйверите за Linux.

В идващите игри (след 1999 г.) той към този момент не работи като водещ програмист, а като механически шеф.

Всъщност той създава игровия енджин съвсем еднолично, до момента в който останалите чиновници се концентрират върху дизайна, равнищата и другите игрови механики. През 2014 година е оповестен сорс кодът на ранните игри Hovertank 3D и Commander Keen. Първите игри са написани на Borland Turbo Pascal и Borland C++ 2.0. Изходният код на Wolfenstein 3D е открит през 1995 година, а на Doom – през 1997 година

Заради репутацията си на разпален техничар в id Sofware Кармак е именуван Джон-Енджина. И в действителност той на процедура напълно независимо създава игровите енджини, до момента в който останалите програмисти се занимават с дизайна, равнищата и други сходни.

Когато става дума за създаването на игри, то в жанра на шутерите Джон Кармак не е просто легенда, а по-скоро Бог.

Детството пред компютъра

Джон Кармак е роден на 20-ти август 1970 година и стартира да се интересува от компютърни игри още в ранна възраст. В подкаст с Лекс Фридман на 4-ти август 2022 година той си спомня, че с часове е седял пред монитора. В учебно заведение един преподавател му демонстрира Apple II и момчето мигновено се влюбва в него. Компютърът бил нещо вълшебно, което изпълнявало команди тъкмо както са написани. Тогава е нямало интернет; изначало дребният Джонди (Джон Д. Кармак Втори) отишъл в библиотеката, потърсил няколко книги за програмиране и се е учил от тях.

Първата си стратегия написа в компютърен магазин, където намира работещ модел и вкарва следното:

10 PRINT " JOHN CARMACK "
20 GOTO 10

По това време Джон евентуално е бил на към 10 години. През идващите години той интензивно учи програмиране и играе Ultima, само че когато на 15-годишна възраст прочита книгата на Стивън Леви „ Хакери. Героите на компютърната революция„, ориста на младежа е предрешена. В книгата се приказва за вундеркинди, които са трансформирали света и културата си: опити с мейнфреймове в MIT, самоделен програмен продукт, самостоятелни компании за разработка на игри. Отпадналият от Харвард Бил Гейтс (автор на интерпретатора на BASIC за Altair), двамата Стиви – Джобс и Возняк – основателите на Apple II и огромни почитатели на компютърните игри. Всички те са били хакери, както и още доста други. И всички обичат игрите. Младият Джонди мислел само по какъв начин да се причисли към техните редици и даже едната година, прекарана в затвор за малолетни, не трансформирала решението му.

 

Най-много му харесва да програмира графика, в това число 3D модели. Резултатът незабавно се вижда на екрана. Първата игра на Кармак се назовава Shadowforge и е доста сходна на Ultima, макар че съдържа няколко спомагателни функционалности: да вземем за пример героят може да нападна в осем направления вместо в четири. Джон печели хиляда $, като продава играта на частна компания. След това продължава да работи на свободна процедура, като продава игрите си на най-различни издатели, преди най-после да одобри предложение за работа от Softdisk. Така стартира кариерата му на професионален разработчик на игри.

Докато работи в Softdisk, 19-годишният Кармак измисля метод за използване на скролиране в компютрите. Това е толкоз пробивна и впечатляваща концепция, че неговият сътрудник Джон Ромеро убеждава вундеркинда да вземе работните компютри от остарялата си компания и да сътвори своя лична компания, която те назовават id Software.

 

На изображението нагоре се вижда работният компютър на Кармак. Използваният екран е 28-инчов Silicon Graphics/Integraph InterView 28hd96 с тегло 45 kg. Това е един от първите монитори на пазара с разграничителна дарба 1920×1080 пиксела. През предходните години му се е налагало да работи с два по-малки монитора. Към 2011 година работната станция е актуализирана до два 30-инчови монитора.

Професионалистът

Някои от професионалните техники на Джон Кармак се загатват в биографичните книги, публикациите и интервютата с него.

Така да вземем за пример Дейвид Кушнер в Lords of Doom (Повелителите на Doom, 2003 г.) загатва за основаването на 3D рендера за Doom. Джон Кармак незабавно схваща, че рендерът, който е написал, се забавя при отварянето на някои равнища. И че казусът е фундаментален. Затова той стартира да чете публикации по компютърни науки, с цел да откри най-подходящото решение за усъвършенстване на рендера и възстановяване на продуктивността. В последна сметка той ползва техника, наречена двоично делене на пространството (binary space partitioning), която в никакъв случай до тогава не е употребена във видеоигрите и която доста форсира енджина на Doom.

 

Техниката за двоично делене на пространството или BSP-tree е решението на казуса с визуализирането на 3D сцена. Понякога се назовава установяване на забележимата повърхнина (VSD).

VSD и изчистването (отстраняването на невидимите полигони) е сложна задача, за която през 90-те години са употребявани десетки подходи, а изчислителната трудност на казуса се усилва като кубична функционалност, което доста бързо се трансформира в ограничителен фактор за визуализирането на реалистични светове.

Накратко, Wolfenstein разполага с първичен рендер за лимитирана сцена (стени единствено в две направления, едно равнище на височина, никакви стълби, плочки върху стена на закрепени интервали), до момента в който за Doom е трябвало да напише напълно нов рендер, насочен към обекти. Той обхожда обектите в сцената и поредно проектира всеки от тях върху екрана.

Джон Ромеро в книгата си Doom: Scarydarkfast (2013 г.) си спомня, че дизайнът на равнищата в Doom през цялото време е бил над 10 пъти по-сложен, в сравнение с във Wolfenstein 3D:

 

„ Трите съществени съставния елемент на дизайна на DOOM, трите опорни точки, които дадоха опция да се откъснем от Wolfenstein 3D, участваха още в първата алфа версия: изменяща се среда, динамично осветяване и проходни браншове. Според бележките към първото издание на играта движещите се браншове (издигащите се и падащи платформи) към този момент са добавени към равнищата, само че към момента не са функционални. Предполагам, че може да се каже, че на този стадий екипът просто се е учил да работи с тях. Първото равнище включваше уголемен набор от спираловидни стълби, сходни на тунели, които водеха до перваз с аспект към друга стая, цялостна с импове. Това бе ранна версия на свързващите браншове, които се трансфораха в присъщ детайл на дизайна (на изображението по-горе). Тази карта в последна сметка се трансформира в E2M7, макар че в началото бе ошлайфана, с цел да се усъвършенства резултатът на мащабиране на хангара от началото на E1M1 “.

Първоначално Кармак се пробва да реши този проблем, като употребява скица на равнищата (такъв метод е прибавен три години по-късно в играта Duke Nukem), само че през 1993 година процесорите не могат да се оправят с подобен логаритъм, изключително когато секторите са вложени един в различен, като да вземем за пример в кръгова стълба.

Като евентуално решение е препоръчана по този начин наречената „ матрица на целите “:

Матрицата демонстрира връзката сред трите обекта въз основа на трите разграничителни равнини и местоположението на гледната точка на камерата – в случай че обектът a(i) закрива обекта a(j), тогава записът a(ij) в матрицата ще бъде  еднакъв на 1.

Изследователите оферират матрицата да се осъществя хардуерно и да се преизчислява на всеки кадър. Основният минус е, че представянето на сцена с n обекта изисква матрица с размер n2. Затова откривателите изследват дали е допустимо матрицата да се показа като „ лист с цели “ и да се употребяват разграничителни плоскости, за могат вярно да се подредят обектите в сцената за рендиране.

Едва през 1980 година в публикация, озаглавена „ За генерирането на забележими повърхности посредством априорни дървовидни структури “ е показан съответния логаритъм за постигането на тази цел. (Henry Fuchs, Zvi Kedem, Bruce Naylor, «On Visible Surface Generation By A Priori Tree Structures», ACM SIGGRAPH Computer Graphics, July 1980).

В тази публикация за първи път е ясно показано BSP дърво (с отпратка към концепцията от 1969 г.). Конструираното BSP дърво може елементарно да се употребява за обезпечаване на предпочитано нареждане на обектите в дадена сцена. По-долу е показана примерна скица за изграждане и обхождане на BSP дърво, представящо обикновена двуизмерна сцена. При триизмерна сцена геометрията е по-сложна, само че концепцията е същата:

Първа фаза: главната линия до стената D разделя сцената на две множества
Втора фаза. Полупространствата от двете страни на D още веднъж се разделят. Стената C е единствената в своето полупространство и там повече не се постанова да се прави делене. Стената B образува нова разграничителна линия в своето полупространство. Стената A също е належащо да бъде разграничена, тъй като самата тя пресича линията на делене
Трета фаза. Подреждането на стените по отношение на гледната точка в горния десен ъгъл е належащо за работата на логаритъма за оцветяването на пикселите. Това е просто поредно обхождане на дървото

Хубавото на BSP дървото е, че то би трябвало да се построи единствено един път и по-късно същото BSP дърво може да се употребява за визуализиране на сцената, без значение от това къде се намира гледната точка на камерата, стига полигоните да не са преместени. Ето за какво BSP дървото е толкоз потребно за рендирането в действително време – цялата сложна работа по построяването на дървото се прави авансово, а не по време на рендирането.

Край на първа част. Джон Кармак е толкоз талантлив, че не може да се събере в една единствена публикация. Във втората част ще продължим с редактора на равнищата на Doom и с другите хрумвания на  един от най-хубавите програмисти на нашия век.

Източник: kaldata.com


СПОДЕЛИ СТАТИЯТА


КОМЕНТАРИ
НАПИШИ КОМЕНТАР