Баг
Снег в Москве в середине октября — это не аномалия. Это баг. Текстура низкого разрешения, которую сервер подгружает, чтобы закрыть пустоту, когда у него не хватает ресурсов на отрисовку голых веток.
Я заметил это три года назад, когда работал ночным тестировщиком. Мы искали уязвимости в банковских транзакциях. А потом я начал искать уязвимости в реальности.
Всё началось с мелочей. Дежавю, скажете вы. Но дежавю — это когда вам кажется, что вы уже переживали момент. А я начал замечать, что моменты повторяются с математической точностью, как зацикленный скрипт.
Диалог в метро
Я спускался на «Китай-городе», и прямо передо мной парень в синей куртке уронил телефон. Экран треснул идеально пополам.
— Да чтоб тебя! — выругался он. — Только с ремонта забрал.
— Держи, — я протянул ему свой старый кнопочный «кирпич». — Мой основной сел в ноль. Позвонишь с него.
— Спасибо, мужик, — он набрал номер. — Алло, мам? Да, я на «Китай-городе» уронил…
Через неделю. Та же станция, тот же переход. Навстречу идет парень в точно такой же синей куртке. Спотыкается на том же стыке плитки. Телефон падает. Экран трескается пополам.
— Да чтоб тебя! Только с ремонта забрал.
Я, уже зная сценарий, молча протягиваю ему кнопочный телефон.
— Держи.
— Спасибо, мужик. Алло, мам? Да, я на «Китай-городе» уронил…
Он говорил те же слова, с той же интонацией, с той же секундной паузой перед «мам». Я подошел ближе. Посмотрел на его лицо. Он меня не узнавал. Для него это был первый раз.
Аналогия с «Танками»
Вечером я пытался объяснить это Лёхе. Мы сидели на прокуренной кухне, и Лёха, как обычно, рубился в «Танки» на своем ноутбуке. Экран мерцал от взрывов.
— Смотри на себя, — сказал я, кивая на его сгорбленную спину. — Ты сейчас в прицеле. Видишь карту на четыреста метров вперед. Там кусты, камни, враг за сеткой. Для тебя это всё существует. Ты ведешь перекрестие, считаешь упреждение. А теперь посмотри в свой кормовой триплекс. Что там?
— Ничего, — буркнул Лёха, не отрываясь от экрана, и сдал назад, прячась за горящей избой. — Там серый туман. Пустота. Сервер не рендерит то, что вне радиуса обзора камеры. Зачем тратить ресурсы на кусты, в которые я сейчас не смотрю? Они существуют только в виде координат.
— Вот, — я щелкнул пальцами. — Мы с тобой — игроки. А парень в метро — это куст. У него есть координаты, скрипт падения телефона и одна ветка диалога. Пока игрок — то есть я — не посмотрел на него, он не прогружен. Как только я вошел в его зону видимости, сервер отрисовал текстуры, запустил анимацию падения и озвучку. Я прошел мимо — и куст снова ушел в спящий режим до следующего игрока.
— Макс, — Лёха наконец развернул свой «Тигр» и закурил, — тебе нужно выспаться. Ты четвертый месяц спишь по четыре часа, гоняешь нейросети. Мозг ищет паттерны там, где их нет. Это апофения.
— Апофения — это видеть лицо в облаке, Лёх. А это — заскриптованная NPC. Неигровой персонаж. У него в коде прописан диалог: «Да чтоб тебя — Только с ремонта — Спасибо, мужик — Мам». Если я вмешаюсь и дам ему телефон, скрипт отработает идеально. Если не дам — он зависнет. Будет стоять и материться, пока не придет следующий игрок и не активирует скрипт своим телефоном.
Сны и буфер обмена
— Если мы в матрице, должен быть способ это доказать, — Лёха стряхнул пепел в банку из-под шпрот. — Не баги с метро, а хардкод. Что-то, что не может существовать в органической химии.
— Есть, — я наклонился к нему. — Сны.
— Сны? Ты серьезно? Мистику приплетаешь?
— Мозг не умеет генерировать новые лица, Лёха. Это медицинский факт. Когда ты видишь во сне прохожего, твой мозг берет за основу черты кого-то, кого ты когда-то видел в метро, в рекламе, в детстве. Он не может с нуля слепить абсолютно незнакомое лицо. А я их вижу. Каждую ночь.
Я открыл ноутбук и вывел на экран папку с записями.
— Последние полгода я записываю сны. У меня тут триста сорок два уникальных лица. Я прогнал их через нейросеть поиска по фото. Ноль совпадений. Ни в соцсетях, ни в базах утечек, ни в старых архивах. Эти люди не существуют.
— И что они делают? — Лёха, вопреки своему скепсису, подался вперед.
— Стоят. Смотрят на меня. Некоторые пытаются что-то сказать, но звука нет. А вчера один подошел вплотную.
Я задрал штанину и показал Лёхе лодыжку. На ней, прямо над старым шрамом от велосипеда, появился свежий, идеально ровный ожог в форме цифры «7». Края были не красными, как от утюга, а бледно-желтыми, словно кожу аккуратно прижгли лазером.
— Я лег спать со здоровой ногой, Лёх. Проснулся с этим. Это не сон. Это дебаггер оставил метку в моей ячейке памяти.
— Во сне было ощущение, что мы в пустом бассейне, — продолжил я, опуская штанину. — Стены выложены белым кафелем, но воды нет, только сухой, гулкий воздух. Он подошел вплотную, положил руку на невидимое стекло прямо перед моим лицом. И показал пальцем вниз. На мои ноги. А потом приложил палец к губам. И я проснулся от запаха горелой кожи.
Лёха долго молчал, крутя в руках зажигалку.
— Ладно, допустим. Мы в симуляции. Зачем? Зачем запускать триллионы NPC, чтобы они ездили в метро и роняли телефоны? Какая вычислительная мощность на это уходит?
— А её не тратится, — я улыбнулся. — Ты же сисадмин. Что ты делаешь, когда локация пуста, а игрок ушел на другой конец карты?
— Отключаю рендеринг. Грузишь только то, что попадает в поле зрения. Оптимизируешь.
— Именно. Когда ты сидишь один в пустой комнате, остальной мир на паузе. Или работает на минималках. Почему, думаешь, люди так боятся одиночества? Почему в пустой квартире время тянется вязко, а в толпе летит? Потому что в толпе серверу приходится отрисовывать тысячи скриптов одновременно. Это нагрузка. А когда ты один — ты в спящем режиме. Ты сам становишься спящим кустом на карте.
Диалог о самоочистке
— Если мы нашли баг, мы должны сообщить разработчикам, — сказал Лёха. — Найти техподдержку.
— Нет никакой техподдержки, — я покачал головой. — Вернее, она есть, но она не для нас.
— Почему? Мы же тоже часть системы.
— Мы — аномалия, Лёх. Посмотри на любой античит. Что он делает, когда видит процесс, который лезет в память игры и пытается изменить значения? Он не пишет разработчику: «Ой, тут игрок нашел дыру». Он просто изолирует процесс, а потом стирает его к чертовой матери, чтобы не заразил остальные сервера. Мы с тобой — вирус. Наше осознание кода — это угроза целостности мироздания. Серверу проще откатить патч и удалить два конфликтных файла, чем переписывать архитектуру всей вселенной.
Стресс-тест в НИИ
Мы решили провести стресс-тест. Если мир — это оптимизированный код, то у него должны быть пределы прорисовки. Мы поехали в заброшенный НИИ на окраине Балашихи. Место, куда не ведут навигаторы. Идеальная тестовая среда.
В главном корпусе пахло мокрой штукатуркой и пылью. Мы поднялись на четвертый этаж. Коридор уходил в темноту.
— Смотри, — шепнул Лёха.
В дальнем конце коридора, там, куда не доставал свет наших фонарей, стояла женщина в белом халате. Она медленно перебирала бумаги за стойкой регистратуры, которой там физически не было. Её движения были механическими, зацикленными. Раз в десять секунд она поправляла волосы.
— Текстура не прогрузилась, — выдохнул Лёха. — Объект есть, а коллизии нет. Она просто висит в воздухе.
— Тихо. Посмотрим на реакцию.
Я крикнул:
— Эй! Кто здесь?
Женщина не повернула головы. Она продолжала перебирать невидимые бумаги.
Мы пошли к ней. С каждым шагом её фигура становилась всё четче, но деталей не прибавлялось. Когда до неё оставалось метров пять, Лёха не выдержал. Он бросил в неё пустую пластиковую бутылку.
Бутылка пролетела сквозь голову женщины, ударилась о стену и с грохотом упала на пол.
Объект даже не моргнул.
— Чисто программный код, — прошептал Лёха, обходя стойку. — Визуальная оболочка без физического движка.
Вдруг за нашими спинами щелкнул выключатель.
— Кто здесь? — голос был хриплым, старческим.
Мы резко обернулись. В конце коридора, который мы только что прошли, загорелась тусклая лампа дневного света. Под ней стоял дед в телогрейке с ведром и шваброй. Самый настоящий. С красным носом, в резиновых сапогах, от которых пахло хлоркой.
— Охрана я, — буркнул дед. — Чего шляетесь? Объект под снос, закрытая зона.
— Мы студенты, практику проходим, — нашелся Лёха.
— Практику они проходят, — дед подошел ближе. От него пахло не только хлоркой, но и дешевым табаком. Он посмотрел на Лёху, потом на меня. Его взгляд был тяжелым, оценивающим, совершенно не похожим на пустой взгляд NPC из регистратуры. — Аномалии ловите? Баги фиксите?
Мы с Лёхой переглянулись.
— Вы тоже видите? — спросил я.
— Мальчик, — дед поставил ведро. — Я здесь тридцать лет полы мою. Я вижу, когда текстуры сыпаться начинают. Вчера в столовой вилка зависла в воздухе. Висела, падла, три секунды. Потом упала. А на прошлой неделе у меня тень оторвалась. Идет впереди меня на два шага. Оборачиваюсь — она останавливается и ждет.
— Вы не NPC, — понял Лёха. — Вы администратор локации. Смотритель.
— Можно и так сказать, — дед усмехнулся, показывая металлические зубы. — Зовите меня Петрович. Вы, я смотрю, глубоко копнули. В системные логи полезли. Только вы не там ищете. Думаете, если найдете главный сервер, то сможете выйти? Ctrl+Alt+Delete этого мира?
— А разве нет? — спросил я. — Должна же быть команда на выход.
Петрович посмотрел на меня с жалостью.
— Вы не игроки, парни. Вы — самый высокоуровневый скрипт самоочистки. Когда в системе накапливается слишком много мусора — таких, как вы, кто начинает видеть код — запускается процесс. Вы находите баги, вы ищете админов, вы пытаетесь взломать реальность. А потом вы находите друг друга. И в этот момент сервер просто стирает этот сектор карты.
— То есть мы сейчас…
— Вы сейчас в карантине, — перебил Петрович. — НИИ этот пустует с девяностых. Стен здесь таких нет, это буфер обмена. Чистилище перед дефрагментацией.
В дальнем конце коридора, за спиной Петровича, воздух пошел рябью. Как от раскаленного асфальта. Штукатурка на стенах начала трескаться и осыпаться мелкой серой пылью, обнажая под собой не кирпич, а идеально ровную, пульсирующую неоном сетку. Мы услышали тихий, нарастающий гул работающих кулеров.
— Ваша беседа потребовала слишком много ресурсов, — спокойно сказал дед, берясь за швабру. — Оптимизация.
— Лёха, бежим! — крикнул я, дергая друга за рукав.
— Поздно, — покачал головой Петрович. — Бег — это тоже анимация. Тяжелая анимация.
Мы рванули назад, к лестнице. Коридор за нами начал сужаться. Это было не просто падение потолка. Стены из крашеного гипсокартона пошли волнами, теряя плотность. Они текли навстречу нам, как густой серый кисель. Пространство схлопывалось не в плоскость, а в точку. Потолок опустился так низко, что нам пришлось согнуться в три погибели. Пыль забивала легкие, становясь густой, как манная каша, и на вкус отдавала озоном и жженой проводкой. С каждым шагом свет наших фонарей бился о сужающиеся стены всё быстрее, пока не заметался в панике, не находя выхода. Воздух стал плотным, его приходилось рвать грудью, он царапал трахею изнутри. Звук наших шагов исчез — резина кроссовок теперь ступала по чему-то мягкому, ватному, поглощающему вибрацию.
— Макс! — хрипел Лёха, его голос звучал так, будто мы на дне океана. — Мой телефон!
— Что?!
— В левом кармане! Он включен! Я вчера поставил на него скрипт рандомизации MAC-адреса! Он каждую секунду генерирует новую сигнатуру! Если мы бросим его здесь, сервер не поймет, какую ячейку памяти стирать! Ему придется пересчитывать всю карту из-за конфликта ID! Это вызовет критическую ошибку!
Лёха сорвал с себя куртку, завернул в нее телефон и швырнул назад, в сужающийся коридор.
— Бросай свой тоже!
Я нащупал в кармане свой смартфон. Руки тряслись. Пространство давило на плечи бетонной плитой. Я швырнул его в пыль.
Секунду ничего не происходило. А потом коридор позади нас с оглушительным треском, похожим на выстрел корабельной пушки, схлопнулся. Ударная волна швырнула нас на лестницу, выбив из легких остатки воздуха. Наступила абсолютная, звенящая тишина.
Мы выбежали на улицу.
Балашиха была на месте. Шумела трасса, моросил тот же искусственный октябрьский снег.
Лёха тяжело дышал, опираясь на капот брошенной у забора «шестерки».
— Живы, — прохрипел он. — Твою мать, мы живы.
— Благодаря тебе. Ты перегрузил его. Заставил обрабатывать пустоту и конфликтующие ID. У него не хватило видеопамяти, чтобы отрисовать наше стирание.
Мы дошли до трассы и поймали попутку до Москвы. Всю дорогу молчали.
Лёха высадил меня у моего дома.
— Я домой, — сказал он. — Приму ванну. Попробую забыть.
— Удачи, — кивнул я.
Я поднялся в квартиру. Включил свет.
На кухонном столе стоял мой ноутбук.
Рядом с ним лежал мой кнопочный телефон, который я отдал парню в метро три года назад. Он был идеально чистым, без единой царапины, и показывал 100% заряда.
А на пустом стуле напротив сидел человек в белом халате. Та самая NPC из регистратуры.
Она перестала перебирать невидимые бумаги. Посмотрела на меня абсолютно пустыми глазами и впервые открыла рот.
— Обнаружена критическая ошибка, — произнесла она моим голосом, но с легким синтетическим эхом. — Запущено восстановление системы из контрольной точки. Дата: 16 октября.
Свет в квартире мигнул. Снег за окном перестал падать, замер в воздухе, а затем пошел вверх, возвращаясь в невидимые облака.
Кажется, в этот раз я зашел слишком далеко. И сервер решил не стирать сектор. Он решил откатить патч. И меня в этом патче, судя по всему, еще не существует.
Я посмотрел на свои руки. Кожа на ладонях начала мелко дрожать, теряя разрешение, превращаясь в серую пиксельную сетку.
Интересно, если я сейчас закрою глаза, прогрузится ли задняя полусфера комнаты, или там так и останется пустота, как в «Танках»?
Свидетельство о публикации №226101502137