Найти в Дзене
Гнездо INDYка

Об оптимизации игр

Оглавление

В последние годы происходит постоянное ухудшение скорости новых игр. Подчас - непонятно, на каком железе они вообще должны запускаться нормально?!

При этом - парадокс в том, что качественный рост не так велик!

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

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

И что для этого можно сделать?!

LOD - уровень детализации

Допустим, на экране вы видите какой-то предмет или существо.

Если вы близко - его видно подробно, а если он на горизонте - без бинокля это просто точка, верно?

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

Можно плюнуть и не рисовать после определенного расстояния, а можно применить LOD: Levels of Details, или уровни детализации.

Шуточно LOD объясняют на такой картинке
Шуточно LOD объясняют на такой картинке

Мы берем модель и делаем несколько ее копий. Каждая последующая - имеет меньше полигонов чем предыдущая.

Примерно так
Примерно так

Игрок эти переходы не замечает, если сделать всё аккуратно: скачек деталей происходит на таком удалении от игрока, когда разница почти не заметна.

Трюк старый и уровни детализации обычно генерируются программно.

"Билборды"

Это часть "магии" LOD, когда на удалении объект меняется не на модель, а на пару полигонов с картинкой этого объекта.

Знаете, когда идёшь, смотришь - человек стоит, а ближе подойдёшь - это просто плоская фигура из фанеры с картинкой!

Вот и тут то-же самое! Зачем рисовать все листья дерева, которое далеко?! Два полигона нарисуются быстее!

Просто ставится объект и делаются его "фотографии" в разных ракурсах.

Билборды - чаще всего часть LOD.

Бывают исключения, когда билбордом является объект, до которого игрок в принципе не дойдет и ему не делают "близких" моделей.

Когда в HL-2 вы пол-игры видите вдали Цитадель - знайте, что это именно билборд. Дома, до которых не дойти - тоже. Это как в кино - "фанерные" декорации. В другой главе вы может туда попадёте, и там они будут полноценными, но сейчас - вы видите муляж!

Скайбокс/скайсфера/скайкупол

Как-бы не хотелось в игре бесконечной вселенной - реализовать ее компа не хватит.

Но небо в открытых пространствах нужно и появляется такое понятие как скайбокс.

Это "коробка", сфера или купол вокруг локации, которая тупо раскрашена так, чтобы казаться небосводом...

Заодно - на ней объекты, которые где-то на горизонте, типа города в той-же Халфе, или город где-то внизу под цитаделью...

Скайбокс позволяет ограничить радиус отрисовки, не рисуя реально то, что на горизонте.

В итоге вы видите хорошо то, что вблизи, коробки вместо объектов на удалении, картинки вместо того, что вдали и скайбокс на горизонте...

Пока понятно? Усложняем!

Отсечки

Вы находитесь в комнате, дверь заперта, окон нет... Что вы видите?!

Только комнату?!

А комп - "видит" весь уровень и пытается его рисовать! Вы его не видите, а он рисуется!

Поэтому следующий шаг - это говорим игре, что не надо рисовать то, что мы не способны увидеть!

Отсечка по камере

Самая банальная - отсечка камеры: камера в игре - это пирамида видимости (в реальной жизни - конус). Если объект не попадает в зону видимости - его не рисуем.

Если попал - рисуем.

Ура?

Уже лучше, но не совсем: вы смотрите на стену, то, что сзади вас - отключила отсечка, но рисуется то, что за стеной!

Портальная отсечка

Итак, вы в комнате, у нее есть дверь в коридор. Из коридора - несколько дверей...

Игра рисует комнату. Полностью или то, что попало в камеру - не суть.

Если в кадр попадает дверь - игра задаётся вопросом, открыта она или нет?! Если открыта - она рисует коридор. Но только коридор!

Если через дверь комнаты ВДРУГ в кадр попадает дверь из коридора в другую комнату - рисуется та комната... И т.д.

По факту - вы всеравно не видите из комнаты все сразу, а значит не нужно это все рисовать!

"Портальной" называется потому, что по факту двери, окна и проломы - это порталы в другие локации.

Квадратичная/кубическая отсечка

Допустим вы в лесу, в нем миллионы деревьев. Вы смотрите на север...

Для отсечки по камере - нужно каждый кадр перебрать миллион деревьев...

Тут применяют весёлый способ: делим весь лес на 4 условных квадрата и сортируем деревья: в какой квадрат они попадают?!

Каждый квадрат - делим еще на 4 и деревья в нем раскидываем по ним... И т.д., пока в очередном квадрате не оказывается некое вменяемое число деревьев...

Зачем?

Берем игрока, он находится в квадрате 1, в камеру 2-4 квадраты не попадают и мы их просто выключаем!

Для квадрата 1 смотрим, какие его части попали? Допустим 1.2 и 1.4, а 1.1 и 1.3 за спиной. Невидимые выключем, видимые идем глубже...

В итоге весь миллион мы не должны перебирать каждый раз: мы перебираем только квадраты, в которые смотрим!

Кубический вариант - это когда делим не только на лево-право-вперед-назад, но и добавляем верх-низ.

Туман

Смешно, но туман - хороший способ облегчить работу компа. Он не только создает загадочность, но и позволяет тупо выкинуть то, что в дали!

Так, второй уровень оптимизации мы прошли, углубляемся в недра движка?!

Батчинг

Как в Юнити происходит отрисовка сцены?

Допустим, есть 100 объектов с одной текстурой/материалом.

Юнити 100 раз отправляет эти объекты на отрисовку...

А если у объекта 10 текстур?!

То он 100 раз по десять это делает!

Как бороться?!

Текстурный атлас

Собираем все 10 текстур в одну большую. Теперь не 10 раз каждый объект рисует, а один!

МешКомбайнер

Допустим, эти 100 объектов - часть одной комнаты. Мы просто "сплавляем" их в один большой! И вот уже не 100 стенок и полов рисуются, а одна комната за 1 вызов!

Статик и динамик батчинг

Юнити кое-что может и сам.

При включении статик батчинга - он пытается сделать вышесказанное сам, если объекты помечены как статические.

Динамический - аналогично.

Что дальше?

Физика

Важно помнить, что Юнити с физикой заморачивается и тратит на нее прилично времени.

Если объект помечен как динамический - юнити потратит время на проверку столкновений со всеми объектами!!!

Как с этим бороться?

Упрощение физики

Быстрее всего проверить пересечение двух сфер: сумма квадратов расстояний между центрами должна быть меньше квадрата суммы радиусов (проще возвести в квадрат, чем искать корень, который ничего в логике не прменяет!).

Сложнее с "капсулой", цилиндром, кубом... Совсем звиздец - с меш-коллайдерами.

Поэтому не заморачиваемся и упрощаем формы! По любому, столкновение с одной длинной стенлй быстрее считать, чем если ее разбить на 10 кусков!

Отсечение физики

Если объект динамический и он остановился - то проще его вырубить, чтобы не морочил голову физикой!

Если в зоне взаимодействия нет динамических объектов активных - режем статические, чтобы не перебирать их физику.

Физический LOD

Переключаемая физическая модель.

Если объект далеко - вам всеравно на то, какой он формой взаимодействует. Если вблизи - это важно.

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

Вроде все... С этим уровнем!

Переходим к...

Запекание

Часть вещей в игре - неизменна, и этим можно воспользоваться для ускорения.

Запекание света

Обсчитываем заранее и создаём карту теней, которая с текстурой наложится на предмет.

Хорошо со статическими объектами и неизменным светом. Комп не заморачивается с рассчетом света и может работать быстрее.

Минус - динамические объекты не отбрасывают тени и теряют блеск объекты статические.

Запекание светопроб

Берём точку в пространстве и смотрим, как она освещена. В дальнейшем - динамический объект в этой точке освещен аналогично.

Запекание проб отражений

По факту - "сферический" скриншот, который используется для блеска. Минус - ну оооочень примерно! И динамические объекты не отражаются.

Запекание интерьеров

Когда в окнах или витринах видно интерьер, но... Его там нету!

Это фальшивка: просто хитро наложенная шейдером текстура.

Итого

Сто процентов что-то ещё забыл, но по факту - даже все это современные разработчики часто забывают использовать, надеясь на мощность компа и видяхи!

Подписывайтесь на мою игру "Замок Зеркал" в Стим.

Лайкайте, комментируйте, подписывайтест на блог!

Удачи!