Самые распространенные баги и проблемы в играх и почему они происходят: взгляд разработчика игр
Я хочу рассказать вам про самые популярные баги и проблемы в играх, с которыми сталкиваются игроки. Но при этом я, как разработчик, хочу рассказать причины таких багов простым языком. Чтобы если вы увидели в игре, почему ваш персонаж провалился сквозь землю, то вы бы понимали, почему так произошло. Будет интересно!
При этом я расскажу как про баги, которые связаны непосредственно с игрой, так и про проблемы, которые связаны с вашим аппаратным обеспечением. Да-да, некоторые проблемы могут создавать и ваши мониторы, например. Начнём.
Персонаж проваливается сквозь землю
Бывало ли у вас такое, что вы идёте куда-то, а потом - персонаж просто так берёт и проваливается пол землю? На самом деле причин для этого множество, но основная проблема - коллизия объекта просто не успела прогрузиться.
Дело в том, что многие объекты в играх имеет свою коллизию, с которыми сталкивается персонаж. Персонаж идёт по земле? Работает коллизия. Сталкивается со стенкой? Работает коллизия. И дело в том, что некоторые объекты по какой-либо причине просто не успевают прогрузиться нормальным образом, а с ним - и коллизия.
Например, игра могла ошибочно направить ресурсы на прогрузку других объектов, а вот прогрузить, например, кусок земли, на котором стоит персонаж, игра просто не успела. Итог - теряется коллизия и персонажу по факту не на чем стоять.
Вот кстати коллизии персонажей. Такие вот кубы, которые вы не видите в играх.
Тупые NPC, которые идут в стену
Бывают в играх такие баги (в особенности в играх Bethesda), когда персонаж может тупо идти в стенку и не видит в этом никаких проблем. Почему так происходит?
Дело в том, что NPC ходят по так называемой навигационной сетке (Navigation Mesh). Это такие зелёные зоны (в Unreal Engine) или синие (в Unity), в пределах которых искусственный интеллект понимает, что он может в этих пределах ходить.
И дело в том, что если в игре плохо настроена навигационная сетка, то бот может идти в стенку или в столб, при этом он не видит никаких проблем - он ведь двигается в пределах навигационной сетки!
Но тут, казалось бы, можно задать вопрос: а почему бот не может понять, что он идёт в стенку, развернуться и уйти? На самом деле, такую логику делали в ранних GTA, но это делают не во всех играх.
И получается ситуация, что персонаж увидел какую-то точку перед собой, к которой он пытается пойти. И он пытается дойти к этой точке, но мешает стена. И получается, что он до этой точки никогда не дойдёт, ибо мешает пройти стена + он движется в рамках навигационной сетки. Не видит проблем, в общем.
Почему персонажа может откидывать (взрыв коллизии)
Бывало ли у вас такое, что вы сталкиваетесь с каким-нибудь физическим объектом (или встаёте на него), а потом вашего персонажа откидывает на километры? В качестве примера - знаменитые качели из GTA 4:
Почему так происходит? Всё просто. У таких объектов есть физика и коллизия, а у вашего персонажа есть скорость передвижения и тоже коллизия. И при совмещении этих компонентов может произойти бум: случайным образом одна коллизия может хотя бы на миллиметр залезть в коллизию другого объекта (опять же, причины разные, вплоть до кривой настройки коллизии) - и один объект тупо выталкивает другой объект, потому что игра говорит: "Так, какого хера? Твоя коллизия во мне? Это же запрещено! А ну брысь!" и выкидывает персонажа за счёт своей физики.
Но игра это может понять слишком поздно, когда коллизии уже пересеклись.
Персонаж застревает в коллизиях
Это связано с том числе и с вышеуказанной проблемой. Но если объект, который имеет физику и коллизию, выкидывает вашего персонажа, то объект с коллизией, но без физики, способен сделать так, что ваш персонаж тупо застрянет.
Опять же, зависит от многих факторов: либо криво настроенная коллизия разработчиков, либо просто игра не успела как-то что-то нормально прогрузить, либо какая-то часть персонажа тупо провалилась через коллизию, а потом коллизия внезапно появляется и все, обратно вашего персонажа она не отдаёт.
И да, ликбез: когда говорят: "Я застрял в текстурах" - это неверно. В текстурах невозможно застрять. Текстуры не имеют коллизии. С ними невозможно столкнуться. Текстуры лишь наносятся на объекты, которые как раз имеют коллизию. Поэтому вы фактически застреваете в коллизии объекта.
Разрыв экрана (Tearing)
Эта проблема уже связана с вашим оборудованием. Разрыв экрана - это когда на экране ваша игра будто бы "разделяется" на несколько фрагментов явно. Почему так происходит? Объясню.
Видеокарта рендерит кадры и отправляет их на монитор, но монитор обновляет картинку с фиксированной частотой (например, 60 Гц или 144 Гц). Если видеокарта выдает больше кадров в секунду (FPS), чем успевает обновить монитор, или просто отправляет новый кадр в тот момент, когда монитор еще не закончил показывать старый, происходит "конфликт". Монитор начинает выводить часть старого и часть нового кадра одновременно, что и выглядит как тот самый разрыв.
Чинится это всё просто. Можно включить V-Sync в настройках игры, что частота кадров монитора и FPS в игре будут синхронными. Либо если ваш монитор поддерживает G-Sync, то лучше включать его. В технические детали лезть не буду, не об этом пост.
Гостинг (Ghosting)
Тоже распространённая проблема, которая может быть связана с вашим оборудованием. Суть в том, что если на экране есть какой-то быстрый объект, то за ним может тянуться шлейф, повторяющий очертание предмета. Выглядит как призрак (ghost).
Если пиксели физически не успевают быстро менять цвет, то при смене кадров движущийся объект оставляет след. Вторая причина - технологические особенности некоторых типов матриц, которые склонны к такому эффекту сильнее, чем другие. Также гостинг может возникать из-за программных методов сглаживания или определенных настроек графики, которые "смазывают" картинку в попытке сделать движение более плавным.
Текст вылазит за поля
Бывало ли у вас такое, что вы заходите в главное меню или подбираете какую-нибудь записку, то текст как будто бы накладывается друг на друга или вовсе вылазит за пределы мониторов?
Это проблема локализации. Дело в том, что некоторые разработчики тупо не тестируют, как выглядит текст на других языках. Из-за этого получается, что на английском, например, текст "You lose" имеет семь символов (без учёта пробела), а на русском текст "Ты проиграл" уже имеет десять символов. И текст просто вылазит за пределы или накладывается друг на друга.
Умелые разработчики это знают и сразу делают виджеты и текст со всеми особенностями локализации, чтобы не было таких вот проблем.
Утечка памяти
Бывают ситуации, когда чем дольше вы играете - тем сильнее начинает глючить игра. Казалось бы, сначала игра шла нормально, а потом - просто невозможно играть!
Ближайший такой пример - Borderlands 4.
Утечка памяти происходит тогда, когда игра "забывает" освобождать оперативную память после того, как данные стали не нужны. Проще говоря, игра запрашивает у компьютера немного памяти под текстуру врага, потом под звук выстрела, потом под эффект взрыва, но после уничтожения врага или завершения взрыва не сообщает системе, что эти участки памяти можно использовать для чего-то другого.
Компьютер думает, что они всё ещё заняты, и резервирует их. Со временем таких "забытых" кусочков накапливается всё больше, и игра начинает потреблять всё больше и больше оперативной памяти, пока не исчерпает весь доступный лимит.
Поэтому разработчики должны контролировать, где и сколько памяти используется в игре, и не занята ли память чем-то ненужным.
Растягивание персонажей
Помните эти смешные ситуации и нарезки с The Day Before, когда персонажи неестественным образом растягивались? Такое случается частенько в играх, где у персонажей есть ragdoll, т.е. физика тряпичной куклы. Когда персонаж может падать различным образом.
И вот тут нужно объяснить, как работает ragdoll и физика персонажей. Дело в том, что физика имеет так называемые constraints (ограничения). Эти ограничения задаются таким образом, чтобы голова, например, не могла развернуться на 180 градусов в обратную сторону. В общем, это ограничение для физики модели.
И бывают ситуации, когда такие констрейны просто ломаются. Например, враг мог одновременно проигрывать анимацию и в этот же момент могла начать работать физика. Из-за этого анимация прерывается, но и слетает ограничитель физики. Из-за этого кость, например, руки, теряя ограничение, может растягиваться до невероятных размеров. Потому что проигрывается физика, которая ничем не ограничена.
Статтеры
Статтеры - это когда происходит резкое падение FPS и игра начинает глючить. И это супер большая тема, почему так происходит. Причин множество. Но коротко расскажу про основные причины:
- Фоновая загрузка чего-либо. Например, вы переходите на новую локацию, и игра не успевает тупо загрузить какие-то объекты. Из-за этого загрузка отнимает часть ресурсов компьютера, из-за чего происходят статтеры.
- Банально что компьютер не тянет игру. Вы можете просто играть, но ваша система не вывозит игру. На мощной системе одни объекты будут прогружаться сразу, не вызывая проблем, а на слабой системе такие загрузки будут отбирать много ресурсов компьютера, из-за чего будут появляться статтеры.
Проблемный LOD
Для игр делают систему LOD, чтобы экономить ресурсы вашего компьютера. Например, один объект делают в нескольких вариациях: высокодетализированный, среднедетализированный и низкодетализированный.
Высокая детализация у вас будет, если вы рядом с объектом. Низкая - если объект далеко.
И мы можем вспомнить с вами релизный Cyberpunk 2077 на консолях, когда мы перед собой могли видеть вот такое:
Почему так? Игра просто не успела прогрузить высокодетализированную модель. И вы видите перед собой то, что должно было быть вдалеке от вас.
Мыльные текстуры
Туда же кстати можно и отнести мыльные текстуры. Когда текстура как будто бы размазанная и теряет в детализации. Если повезёт - она прогрузится прям перед вами. Если нет - то мыло так и будет висеть перед вами.
Почему так происходит?
Дело в том, что в играх есть так называемый стриминг текстур. Если вы близко к объекту, то игра подгружает качественную текстуру. Если вы далеко от текстуры - то размазывает её. Ну, условно говоря, вблизи текстура может быть 4К, а вдалеке разрешение существенно снижается.
И по некоторым причинам текстура просто тупо не успевает прогрузиться. Из-за этого вы и можете видеть мыло. Это может быть из-за плохой оптимизации игры, так и если у вас просто слабая машина, которая не успевает подгружать текстуры.
Мерцание текстур (Z-fighting)
Мерцание текстур (Z-fighting или фликер) в играх - это артефакт, при котором поверхности начинают хаотично мигать, переливаться или "драться" друг с другом. Выглядит это так, будто текстура на стене или полу вибрирует, и сквозь неё то проступает, то исчезает то, что находится за ней. Чаще всего это заметно на больших расстояниях, в местах стыковки объектов или при наложении полупрозрачных поверхностей.
Основная техническая причина этого явления - ошибка в работе буфера глубины (Z-буфера). Буфер глубины - это механизм, который определяет, какой пиксель находится ближе к камере и должен быть видимым, а какой скрыт за другим объектом.
Когда две или более поверхности расположены почти идеально параллельно и находятся на очень близком расстоянии друг от друга (например, текстура травы наложена прямо на текстуру земли, или две стены вставлены одна в одну), компьютер "теряется".
Он не может точно вычислить, какая из них ближе, и начинает в каждом кадре случайным образом выбирать то одну, то другую. В результате изображение хаотично переключается между ними, создавая эффект мерцания. Иногда причиной также может быть низкая точность расчётов глубины на больших дистанциях или проблемы с компрессией текстур.
Проблемы с culling (пропадает часть объекта)
В играх работает culling (отсечение). Есть frustom culling, есть occlusion culling и так далее. Если коротко - то игры не рендерят то, чего не видит игрок. Тупо экономия ресурсов. Зачем рендерить то, что находится за камерой персонажа? Вот именно.
И иногда получается ситуация, что часть вашего объекта может тупо становиться невидимой! Почему так? Поломка. Игра почему-то думает, что вы этот объект не видите, а значит он его не рендерит. Тут во всём виноват, опять же, рендер движка, на котором сделана игра. Можете попробовать обмануть рендер - отвернуть камеру от вашего объекта и медленно начать к нему поворачивать. Рендер, скорее всего, встанет на своё место.
===================
Об авторе:
Являюсь разработчиком игр и веду свой YouTube канал по созданию игр на Unreal Engine и второй канал по Unity. Если интересно, то можете заглянуть и подписаться, поскольку показываю в своих видео, как создаются популярные игровые механики.