Ему только нужно было знать, что программа должна будет делать, когда игрок достигнет определенного тайла. Том понял: это потрясающе. Игры вроде Super Mario Brothers 3 были полны анимированных тайлов. Например, игрок мог запрыгнуть на мерцающий блок, и тогда из него начинал сыпаться дождь из монеток. Том был взбудоражен. Но это было еще не все.
Кармак нажал пару клавиш на клавиатуре и показал Тому свою новую фишку: сайд-скроллинг. Эффект, моду на который ввели Defender и Mario, создавал впечатление, будто игровой мир продолжался, когда персонаж двигался в направлении края экрана. Потратив несколько ночей на эксперименты, Кармак наконец-то разобрался, как перенести этот эффект на PC. Как и всегда, он сумел найти оригинальный подход к решению проблемы. Слишком многие, думал он, пытались с самого начала выстраивать свои программы вокруг хитрых уловок. В этом не было смысла. Первым делом он подошел к проблеме максимально прямолинейно: написал программу, которая должна была плавно прорисовывать графику на всем экране целиком. Программа не работала, и всем было очевидно почему: PC были слишком медленными. Тогда Кармак перешел ко второму шагу: оптимизации. Был ли способ эффективнее использовать память компьютера, чтобы изображения прорисовывались быстрее? После ряда попыток он понял наверняка: это было невозможно.
Наконец, он спросил себя: «Так, а чего я вообще тут пытаюсь добиться? Мне нужно, чтобы экран как будто плавно сдвигался, пока пользователь по нему бежит». Он вспомнил свою прошлую игру, The Catacomb. В ней экран прокручивался как единое целое, когда персонаж подходил к границе подземелья. Это было популярным трюком: скроллинг, основанный на тайлах, смещал экран крупными кусками, по одному набору тайлов за раз. Он хотел добиться более плавной прокрутки, когда персонаж сдвигался на самую капельку. Проблема была в том, что компьютеру требовалось чересчур много времени и мощности, чтобы перерисовывать весь экран при каждом маленьком движении. И в этот момент его осенило.
Кармак подумал: «А что, если вместо того, чтобы перерисовывать весь экран, я бы мог найти способ перерисовывать только те объекты, которые меняются? Тогда скроллинг будет отрисовываться гораздо быстрее». Он представил себе, как персонаж бежит по экрану на фоне большого синего неба и в какой-то момент над его головой проплывает белое кучерявое облачко. Если компьютер будет подходить к этому в обычном ключе, ему придется перерисовывать каждый пиксель синего неба на всем экране, тогда как единственное, что действительно меняется, – это белое облачко. Компьютер не может сам упростить себе задачу просто потому, что это кажется логичным. Поэтому Кармак придумал еще один гениальный ход. Он нашел способ заставить компьютер работать более эффективно. Он написал код, который заставлял компьютер думать, что, например, седьмой тайл слева на самом деле был первым тайлом на экране. Таким образом, компьютер начинал отрисовку строго в том месте, где это было Кармаку необходимо. Вместо перерисовки одних и тех же синих пикселей по пути к облаку, он начинал сразу с самого облака. Чтобы эффект ощущался более плавным, Кармак добавил еще одну деталь. Он заставил компьютер отрисовать дополнительный тайл синего неба за правой границей экрана и хранить его в памяти, когда игрок продвигался в эту сторону. Благодаря этому сохраненные в памяти тайлы выводились на экран мгновенно, без необходимости отрисовывать их в процессе. Кармак назвал этот процесс «адаптивным обновлением тайлов».
Том немедленно сообразил, что это означало:
– А давай так и сделаем! – воскликнул Том. – Давай воссоздадим первый уровень из Super Mario, сегодня же!