Откуда берутся баги

Рассказы и личный опыт левел-дизайнера, аниматора, геймдизайнера и геймплей-программиста.

Иногда играть в игру легко и приятно. А иногда выходит могучий польский долгострой, и тут начинается: машины улетают в небо, персонажи уходят в стену, противники застревают на ровном месте, а мусорные баки занимаются кибернетической некрофилией.

Embedded Image

Cyberpunk 2077

Но ладно, не будем глумиться — для этого у нас есть отдельный материал. На самом деле, баги в играх есть всегда. Во время разработки их появляется гораздо больше, чем потом видят игроки в финальной версии. Просто исправляются баги по приоритету — какие чаще встречаются, какие намертво вешают игру, — поэтому что-то остаётся на радость пользователям.

Проблема ещё и в том, что ошибку далеко не всегда получается быстро найти и исправить. Багующая анимация может быть связана с физикой, а неработающий квест оказаться проблемой левел-дизайна. Иногда вообще сам движок портит или путает данные.

Мы решили с помощью наших преподавателей разобраться в самых частых проблемах, из-за которых в играх появляются баги. Левел-дизайнер Денис Куандыков рассказал о дырах и коллизиях на локациях, старший аниматор Александр Магомедов — о костях и импорте движений. Геймдизайнер Сергей Праздничнов объяснил, почему сходит с ума искусственный интеллект, а геймплей-программист Александр Балакшин — как ломается сетевой код и системы сохранений.

The Witcher 2: Assassins of Kings

Баги на локациях обычно появляются из-за итеративного подхода к разработке, когда уровень создаётся в несколько этапов — подробнее о них мы рассказываем в этом материале. Во время этого процесса в игре копятся забытые стены, лишние камни и деревья, которые мешают пройти или, наоборот, позволяют забраться в недоступное место. А удаляются они потом далеко не всегда.

На первой версии уровня — блокауте, локация может работать без проблем: игрок свободно перемещается и нигде не застревает. Но потом, когда «болванка» начинает обрастать деталями и декорациями, ошибки появляются на каждом шагу.

Uncharted 4: A Thief’s End

В открытых мирах, особенно природных, левел-дизайнер лучше потратит время на проектирование арен, на интерьеры, на точки входа — словом, на что-то конкретное. А многокилометровую степь можно набросать очень грубо. Поэтому там художники включают своё воображение на всю катушку, но иногда забывают про метрики и про то, куда должен проходить персонаж.

Embedded Image

Левел-дизайнер

Например, левел-дизайнер может расставить горы на локации так, чтобы игрок не мог на них забраться. Художник же решит, что на склоне будут здорово смотреться деревья, и расставит их как-нибудь покрасивее. А игроки потом научатся по этим деревьям забираться в недоступную часть уровня — как было с аэропортом в классическом World of Warcraft.

World of Warcraft Classic

Из-за разных итераций на локациях появляются дыры — места, в которых игрок и NPC проваливаются в другую часть уровня или вообще под его геометрию. На этапе блокаута такие места встречаются реже, так как левел-дизайнеры используют ограниченное число простых объектов — кубик или шар проще подогнать под нужное расположение, да и сложной формой они не отличаются.

Marvel’s Spider-Man

Художники по окружению добавляют простым формам необычную геометрию, и иногда из-за их действий на локации появляются миллионы новых полигонов. При этом зачастую в ход идут процедурные кисти — инструменты, которые сами расставляют фоновые объекты (про их устройство у нас тоже есть материал). Работу таких алгоритмов сложнее просчитать, да и точностью они не отличаются — так в играх появляются парящие в воздухе деревья и дырявые горы.

The Witcher 3: Wild Hunt

Отчасти жизнь левел-дизайнерам упрощают дебаггеры — встроенные в движок инструменты, которые показывают все дыры и наложения на локации, а иногда и сами находят слишком узкие для персонажа или камеры места. Но в сложном пространстве не спасают даже они: в этом обычно виновата физика игры и то, как она обрабатывает коллайдеры — невидимые игроку геометрические границы объектов.

В играх крайне редко встречаются точные коллайдеры, то есть физические модели — это слишком дорого. Вместо этого в любом движке есть собственный такт расчёта — метроном, по которому происходят все вычисления. И как бы ни был отлажен, физика может обсчитаться так, что на какую-то доли секунды получится математическая погрешность. И тогда всё, игрок провалится через коллайдер.

Embedded Image

Левел-дизайнер

Grand Theft Auto V

Чем больше на уровне коллайдеров, тем сильнее погрешность в их расчётах. Особенно если речь идёт о больших локациях и столкновениях объектов друг с другом. В Grand Theft Auto IV игроки могли найти качели с не очень точным коллайдером, которые непринуждённо отбрасывали персонажа на другой край карты. Для этого нужно было всего лишь подъехать к ним на машине и отчаянно газовать — качели попытаются оттолкнуть машину, машина продолжит ехать в качели, сила и инерция накопятся, физика сломается — и игрок отправится в космос.

Grand Theft Auto IV

Посторонние объекты на уровне могут появляться и по другим причинам. Например, во время работы над локацией левел-дизайнеры видят тот её слой, который недоступен игроку, — гизмы. Сюда входят иконки движка, триггеры, скрипты и границы коллайдеров, словом — внутриигровая логика. И чтобы она не мешала дальнейшей работе, её иногда удобнее частично спрятать, а не удалять вовсе.

Когда игрок выбирается за пределы карты, он рискует найти эту скрытую логику. Там же он может встретить отдельные объекты, которые левел-дизайнеры убрали под локацию — запасные стены или устаревший ассет. А если на каком-то этапе работы локацию решат целиком сдвинуть вниз, то вся «мусорная часть» вылезет наружу.

Fallout 4

Ещё одна любимая практика левел-дизайнеров и художников — делать готовые палитры. Например, мне удобно работать с каким-то комплектом лестниц, окон и дверей. Чтобы не открывать каждый раз редактор или лезть в определённую папку, я закидываю объекты в одну комнату, делаю так, чтобы они не влияли на производительность и постепенно их оттуда вытаскиваю. А если такой мусор за локацией не влияет на графику, то его иногда и не удаляют. Например, почти во всех моих уровнях в нулевой координате на высоте -100 или -1000 есть кубик, я его называю Zero — он помогает точно понимать, где у меня на локации «ноль».

Embedded Image

Левел-дизайнер

В этом хаосе невидимых и видимых препятствий нужно ориентироваться не только игроку, но и NPC. У искусственного интеллекта нет зрения, поэтому саму локацию он не видит. Вместо этого ИИ использует набор скриптов и навигационную сетку, также известную как навмеш. Это отдельная, скрытая от игрока геометрия, которую NPC используют для перемещения по локации.

Assassin’s Creed Syndicate

Навигационный меш обычно расположен на земле, а для летающих персонажей его размечают прямо в воздухе с помощью набора точек. На этой сетке отмечаются не только доступные NPC маршруты, но и специальные области взаимодействия. Например, чтобы персонаж мог прыгнуть через пропасть, на её краях нужно сделать пометки: тут — прыгать, там — приземляться.

Проблема в том, что навмеш крайне редко создаётся в реальном времени — если речь не идёт о процедурных играх, конечно. Его обычно запекают заранее, и из-за этого возникают неприятные ситуации. Например, левел-дизайнер подвинет дом или уберёт ящик из комнаты, а потом забудет пересчитать навигационную сетку. И NPC в игре будут либо бежать лбом в стену, так как видят только меш, а не саму модель дома, либо обходить ящик, который когда-то давно стоял в помещении. Это отлично видно в S.T.A.L.K.E.R.: Shadow of Chernobyl — если открыть любую локацию из игры в редакторе, то можно увидеть чуть ли не все примеры кривых мешей навигации.

Embedded Image

Левел-дизайнер

S.T.A.L.K.E.R.: Shadow of Chernobyl

Если в игре одновременно присутствуют сотни персонажей, которые должны перемещаться по чётко заданным маршрутам, без навигационной сетки можно и вовсе обойтись. Чтобы сэкономить ресурсы, разработчики заменяют навмеш на доступные альтернативы.

Так, в Cities: Skylines игрок сам рисует дороги и задаёт маршруты для горожан. Но вместо навигационного меша игра использует сплайны — векторные кривые, которые задают персонажам маршрут. Сплайны напоминают бусы — сама линия может быть любой формы, но на ней есть определённые точки-бусины, по которым объекты и перемещаются. Но если сплайн сгенерировался неправильно или отдельные точки не смогли соединиться на одной кривой, то эта система начнёт сбоить.

Cities: Skylines

Сломанные движения персонажей чаще всего связаны с «костями» — узлами, которые лежат в основе скелетной анимации. Из-за них у моделей могут неестественно растягиваться руки, уезжать в сторону глаза и в целом подкашиваться ноги.

Анимации очень редко ломаются целиком. Гораздо чаще баги появляются, когда аниматоры забывают сохранить всего одну косточку — из-за этого у персонажа что-то перестаёт нормально двигаться или начинает куда-то уезжать. Например, если у ящерицы отключатся кости в хвосте, то сама она будет двигаться плавно и натурально, но хвост останется прямым, как палка.

Embedded Image

Аниматор персонажей

Uncharted 2: Among Thieves

Скелетная анимация оставляет огромный простор для ошибок. Когда аниматор сохраняет движение, он может нечаянно назначить его другому персонажу. Может неправильно назвать анимацию или подключить её к другим костям. А иногда и сам движок на стадии интеграции перенаправляет движение от одного персонажа к другому.

Например, у ручного волка из Assassin’s Creed Valhalla иногда включается очень странная анимация бега. Такое может случиться, если вместо анимации животного частично подгрузится анимация человека. Причём в этом случае работать будут только те кости, которые у двух моделей совпали. И получится так, что животина побежит по-человечески, но верхняя часть её тела останется почти статичной.

Assassin’s Creed Valhalla

А в бета-версии Battlefield 3 из-за скелетной анимации шеи персонажей в лежачем положении иногда неестественно вытягивались, а следом ломались и остальные движения. В этом случае кость могла съезжать из-за шального параметра, который перегружал движок информацией.

Battlefield 3

Лицевая анимация тоже может быть завязана на костях, к которым привязываются основные части лица — челюстр, например. Но чаще для отдельных мимических движений используют блендшейпы — деформации, которые вытягивают отдельные части лица в заданном направлении. Если скелет модели или блендшейпы обновятся и аниматор забудет правильно перенести анимацию, то мимика поедет. У этих багов есть даже народное творчество «по мотивам» — ролики в духе «Resident Evil 2 с выкрученной на 500% лицевой анимацией». А в первом «Ведьмаке» из-за такого же бага персонажи иногда превращались в ночной кошмар художника Frictional Games.

The Witcher

К слову, больше всего проблем вызывают анимации всевозможных чудовищ. Тут работает простое правило — чем больше конечностей, тем больше возможностей для ошибки. Так, в Hunt: Showdown босс-паук иногда путался в своих же восьми ногах, начинал их неправильно переставлять и в итоге застревал в геометрии.

Hunt: Showdown

Иногда анимация сильно привязывается к физике — то есть на любое записанное движение влияет ещё и симуляция, которая есть в игре. Такой подход часто встречается в симуляторах — так, в серии UFC любое движение может сломаться из-за слишком сильного воздействия. Например, тело после особенно мощного удара попытается отработать движение, но вместо этого начнёт неестественно загибаться.

UFC 3

Также физика вступает в дело, когда персонаж умирает и его анимации отключаются. Рэгдолл, то есть оставшаяся «кукла», использует физическую симуляцию — катится по ступенькам, падает с обрывов и так далее. А заодно показывает, насколько хорошо разработчики настроили физику тел. Если же отключить рэгдоллы совсем, то персонажи будут оставаться в том положении, в каком была записана анимация смерти — как трупы из Counter-Strike 1.6, которые даже на лестницах лежат ровно по горизонтали.

Counter-Strike 1.6

К слову, баги анимации — это не всегда вина аниматора. Они могут появляться из-за неправильного импортирования — например, криво лежащее в руках оружие. А известная «Т-поза» — это обычно проблема движка, который просто не может найти нужную анимацию.

Cyberpunk 2077

Часто в багующей анимации виновата физика или коллизия с локацией. Например, на этапе интеграции в саму игру иногда ломается рут — основная кость персонажа. Если он сместится или получит неверный параметр, то вся анимация может оказаться чуть ниже земли — так, что ноги персонажа пройдут сквозь локацию. Коллизия попытается их вытолкнуть, но при этом сохранить местоположение. А для этого придётся слегка сместить сам объект.

Embedded Image

Аниматор персонажей

Так, повозки в Assassin’s Creed Origins из-за коллизии иногда застревали и принимались вращаться во все стороны. Быки или лошади упирались лапами в геометрию локации и вся конструкция начинала «брыкаться». Движок понимал, что лапы моделей не должны проникать сквозь землю, но анимация телеги продолжала толкать повозку вперёд.

Assassin’s Creed Origins

Кстати, странно пританцовывающая Плотва из третьего «Ведьмака» — тоже результат коллизии. Причём у неё обычно сбоили только ноги, а у более простых моделей вроде ящика или кружки столкновение с локацией вызывало более серьёзные судороги, а иногда и переворачивало целиком.

The Witcher 3: Wild Hunt

Также на локациях встречается специальная разметка с активными точками для анимации. Это может быть сундук, по которому бьёт ногой Линк, или компьютер персонажа из Deus Ex: Mankind Divided. Если точка для проигрывания анимации указана неправильно, то модель будет промахиваться или просто водить руками в воздухе. А отдельная головная боль — когда на такой разметке держится скалолазание и прочий паркур.

Deus Ex: Mankind Divided

Для карабканья обычно используются целые системы якорей — точек, за которые может цепляться персонаж. Их можно задавать динамически, чтобы персонаж сам определял, где может повиснуть. А можно — с помощью невидимой разметки, которая иногда ломается — точки зацепа начинают улетать в сторону, а руки персонажа продолжают их искать. И даже если они найдут цель, например, в двух километрах над землёй, то всё равно попытаются до неё дотянуться.

Embedded Image

Аниматор персонажей

Источник цитаты:

Assassin’s Creed III

Баги геймдизайна — это самые разнообразные баги. В зависимости от жанра и конкретной игры они могут ломать экономику, поведение персонажей и их способности со всеми сопутствующими эффектами.

Например, в шутерах регулярно сбоит положение персонажа, особенно если кроме стандартных состояний «стоя» и «присев» есть ещё и третье — «лёжа». Когда персонаж находится в лежачем состоянии, с его моделью могут происходить самые разные непристойности. Она может перекручиваться, странно изгибаться, в худшем случае — проходить сквозь объекты. А внимательный противник может и пристрелить игрока в торчащую сквозь стену пятку.

PlayerUnknown’s Battlegrounds

Также часто возникают проблемы с цифровыми значениями. Например, геймдизайнеры могут неправильно задать импульс, который применяется к персонажу во время удара или выстрела. Из-за этого простой залп из дробовика будет отбрасывать цель в другой угол комнаты, а великаны из The Elder Scrolls V: Skyrim — отправлять персонажа далеко в закат своей дубиной.

The Elder Scrolls V: Skyrim VR

Иногда начинает сбоить взаимодействие персонажа с пространством и средой — то есть параметры, которые указывают, где герой будет ходить, где плыть, а где падать. Так, в Sekiro: Shadows Die Twice на локации встречались места, где свойства воды срабатывали неправильно, из-за чего персонаж мог всплыть в своеобразную «дырку» и продолжить плыть уже по воздуху.

Sekiro: Shadows Die Twice

Наконец, отдельная категория багов — это проблемы искусственного интеллекта. Обычно NPC в игре мыслят более сложно, чем «добежать до игрока и завязать перестрелку»: их поведение — это зачастую целая логическая система.

У искусственного интеллекта сложная иерархия поведения — он не просто бежит к игроку, но ещё и может распознавать препятствия, искать оптимальный путь, звать подмогу и убегать, когда мало здоровья. Чем больше в этой системе элементов, тем больше между ними взаимодействий. А если добавить в эту систему ещё и игрока, то количество взаимодействий многократно возрастает.

Embedded Image

Геймдизайнер

Alien: Isolation

Так, если игрок залезет в какое-то место, на которое геймдизайнер не рассчитывал, ИИ может просто сломаться и встать на краю доступной ему области. Или просто уйти — это означает, что оказавшийся в неправильном месте игрок перестаёт быть для него целью.

В играх с открытым миром NPC подчиняются расписанию, которое прописано в их логике: утром они выходят из жилищ, идут на работу, общаются со знакомыми. Но это идеальная ситуация — когда что-то в их расписании ломается, персонажи начинают открывать лавки в полночь, а спать — среди бела дня. Когда ситуация совсем плоха — ещё и посреди улицы.

Grand Theft Auto V

Расписание ИИ — это набор счётчиков или таймеров. С помощью них геймдизайнеры задают персонажу нужды — действия, которые он начнёт выполнять, включив определенную анимацию. Например, пойдёт домой и включит анимацию «лечь на кровать». Каждый счётчик привязан к чему-то и может увеличиваться или уменьшаться. Когда один из счётчиков дойдёт до определённого значения, действие переключится, сработает триггер — и персонаж пойдёт заниматься тем, на что ему укажет система. Так, у NPC-торговца днём будет накапливаться счётчик пойти торговать на рынок, но при этом будет падать бодрость.

Embedded Image

Геймдизайнер

Проблема в том, что иногда эти счётчики путаются или застревают на нуле. Разработчики могут вообще нечаянно стереть или переименовать один счётчик, и тогда персонаж лишится целого действия. А если счётчики пересекаются и какой-то закончится быстрее, то NPC просто пойдёт не туда, куда нужно.

The Witcher 3: Wild Hunt

Иногда в счётчике отсутствует предел, поэтому он тикает бесконечно. Или геймдизайнер нажмёт лишний раз на кнопку и задаст значение не 9000, а 90000 — тогда NPC будет просто стоять и смотреть на игрока. Тому покажется, что искусственный интеллект не понимает, что ему делать, хотя на самом деле всё он прекрасно понимает… Просто не спешит.

Так, в первом сезоне Hitman на первом же уровне часто ломались счётчики у двух целей — Виктора Новикова и Далии Марголис. Когда игрок подготавливал ловушку в конкретной локации, у персонажей отключался счётчик, который должен был их туда привести. А так как маршрут целей фиксирован, в итоге они просто оставались в последней активной комнате, хотя и продолжали реагировать на отдельные раздражители.

Hitman (2016)

Ещё одна проблема поведения NPC появляется, если в игре есть фракции. В логике искусственного интеллекта они обозначены цифрами — Team ID, которые указывают на принадлежность к определённой команде. ИИ понимает, что перед ним противник, если у того в настройках указано соответствующее значение — обычно просто другой Team ID. Как правило, таких значений в играх немного, но иногда разработчики могут их перепутать или оставить стандартными. И тогда система определения «друг-враг» начинает подводить.

Даже когда игрок не участвует во взаимодействии NPC, те всё равно попытаются разыграть между собой сложные сценки. Например, в бою разные фракции будут использовать отдельный шаблон поведения — не тот, который бы включался в бою с игроком. Но стоит только выставить новому архетипу врагов другой ID в движке — и всё, фракции будут реагировать на него неправильно или игнорировать. Также разные «команды» могут получить неправильный приоритет и лупить друг друга, забыв об игроке, — хотя иногда это даже делается намеренно.

Embedded Image

Геймдизайнер

The Elder Scrolls IV: Oblivion

Баги в коде игры, её физической симуляции или в самом движке бывает трудно заметить, а ещё сложнее — выловить. Программист может потратить недели, чтобы просто исправить несколько строчек в файле, но именно они зачастую целиком портят ощущения от игры.

Например, любителям мультиплеерных забегов хорошо знакомы баги сетевого кода. Как правило, они связаны с репликацией — синхронизацией данных между клиентом и сервером.

Иногда репликация создаёт относительно скучные ошибки — например, увеличивает объём сетевого трафика до 30 мегабайт в секунду. У игроков из-за этого будет расти пинг вплоть до того, что играть станет вообще невозможно. Более странные результаты получаются, когда репликация не просто передаёт данные с задержкой, а частично теряет их.

Если при передаче на сервер часть данных теряется — о местоположении, например, или траектории движения, — то движок сразу замечает, что позиция в клиенте и на сервере отличается. Он пытается её скорректировать. При этом сервер пытается продолжить наиболее адекватную симуляцию, чтобы игрок потом внезапно не телепортировался в новое место.

Embedded Image

Геймплей-программист

Обычно репликация использует последнее действие игрока и старается его продолжить. Скажем, персонаж будет двигаться по прямой, если в момент разрыва соединения игрок тоже двигался вперёд. Но если потеряется какое-то конкретное действие — например, использование транспортного средства, — то синхронизация сработает неправильно. Так, в Tom Clancy’s Ghost Recon: Wildlands сервер иногда терял команду залезть в вертолёт, а потом начинал синхронизировать движение персонажа — и тот просто бежал в воздухе.

Tom Clancy’s Ghost Recon: Wildlands

Также репликация может мешать работе проджектайлов — предметов, которые игроки бросают друг в друга. Для движка игры всевозможные гранаты и дымовые шашки — это не физическое понятие, а просто объект с заданной траекторией. У него есть геометрическая форма, которая вытягивается по мере движения, но не взаимодействиует с геометрией. Поэтому такие снаряды иногда пролетают сквозь стены, если сервер невовремя теряет часть данных.

Другая проблема — баги в системе сохранения, из-за которых игроки могут застревать на локации, терять прогресс или оказываться не там, где были в последний раз. В самых тяжёлых случаях сохранение может вообще не загрузиться — такое случается, когда в его файле меняется раскладка данных.

Tomb Raider (2013)

Сохранения сами по себе не могут быть точными — по крайней мере, если разработчики не хотят получить файлы весом в гигабайт. Как правило, дотошно сохраняется только то, что находится ближе к игроку — трупы в той же комнате, расположение противников в соседней. Но чем дальше от точки сохранения находится объект, тем меньше ему уделяется внимания. А в ранних версиях стратегии Stellaris из файлов сохранения пропадали технологические открытия и финансы игрока.

Stellaris

Кстати, сломанные сохранения часто используются в спидранах — быстрое сохранение и загрузка пересобирают уровень с нуля, и в этот момент игрок может прошмыгнуть за закрытую дверь или войти в глухую стену. Например, в самом начале Half-Life 2 можно выпрыгнуть из поезда прямо на ходу — для этого нужно несколько раз сохраниться, загрузиться, и вагоны начнут собираться гармошкой.

Half-Life 2 (Источник)

Это называется ошибкой выставления изначального состояния объекта. Она часто встречается в играх с открытым миром, в которых есть динамическая подгрузка объектов с разным состоянием. При выходе из локации это состояние нужно сохранить, при возвращении — загрузить. Все данные вокруг объекта сохранить невозможно, поэтому сохраняется только набор ключевых параметров, а остальные вводятся на основании общих формул в коде.

Embedded Image

Геймплей-программист

Отдельную сложность для системы сохранений представляет инвентарь. Например, из него могут пропадать предметы, если в данных сохранения что-то перепуталось, — тогда инвентарь будет сохраняться или загружаться с ошибкой. А в Fallout 76 вещи регулярно пропадали не только из инвентаря, но и из экипировки или со склада игрока. Также может сломаться квест, который должен давать игроку предмет — в этом случае ошибка помешает самому событию «добавить вещь в инвентарь», а игрок об этом может даже не узнать.

Fallout 76

Наконец, самые весёлые баги кода, которые моментально попадают в тренды YouTube, — это баги, связанные с физикой. Встающие на дыбы машины и уходящая из-под ног персонажей земля встречаются не во всех играх, ведь для таких багов нужна более-менее серьёзная физическая симуляция. И чем она сложнее, тем интереснее выглядят её ошибки.

Far Cry 3: Blood Dragon

Так, в Red Dead Online игроки нашли брыкающийся мост, который в определённый момент начал раскачиваться и сбрасывать с себя персонажей. Этот мост работал не как статичный объект, а как физическая симуляция подвесной конструкции, которая где-то и дала сбой.

Для физики верёвок и тканей обычно применяется Position Based Dynamics, в которой иногда случаются ошибки вычислений. Причин может быть много: где-то некорректно ввели данные, или что-то должно было быть равно нулю, а получило другое значение, возможно — слишком высокое. В случае с мостом разработчики могли изначально ввести какой-то неверный параметр, потом мост раскачивался, параметр рос, а ошибка копилась.

Embedded Image

Геймплей-программист

Red Dead Online

Комментарии: 0