В последние годы происходит постоянное ухудшение скорости новых игр. Подчас - непонятно, на каком железе они вообще должны запускаться нормально?!
При этом - парадокс в том, что качественный рост не так велик!
Для себя я решил вопрос просто: я не гонюсь за топовым железом. Оно у меня - по нижней-средней планке и создаваемая игра должна идти на нем нормально, а не на топ-железе, которое есть не у всех.
Простая мысль: чем у большего числа людей она сможет идти, тем больше людей смогут ее купить! А не только тот десяток человек с "золотыми" видеокартами!
И что для этого можно сделать?!
LOD - уровень детализации
Допустим, на экране вы видите какой-то предмет или существо.
Если вы близко - его видно подробно, а если он на горизонте - без бинокля это просто точка, верно?
Проблема в том, что для компьютера он остаётся все той-же здоровенной кучей полигонов и он вынужденно рисует эту точку на экране во всех подробностях!
Можно плюнуть и не рисовать после определенного расстояния, а можно применить LOD: Levels of Details, или уровни детализации.
Мы берем модель и делаем несколько ее копий. Каждая последующая - имеет меньше полигонов чем предыдущая.
Игрок эти переходы не замечает, если сделать всё аккуратно: скачек деталей происходит на таком удалении от игрока, когда разница почти не заметна.
Трюк старый и уровни детализации обычно генерируются программно.
"Билборды"
Это часть "магии" 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
Переключаемая физическая модель.
Если объект далеко - вам всеравно на то, какой он формой взаимодействует. Если вблизи - это важно.
Вот стоит шкаф, вы по нему пнули мячом, он отскочил как тупо от коробки прямоугольной, но если вы близко - модель усложняется, чтобы рукой почувствовать рельеф.
Вроде все... С этим уровнем!
Переходим к...
Запекание
Часть вещей в игре - неизменна, и этим можно воспользоваться для ускорения.
Запекание света
Обсчитываем заранее и создаём карту теней, которая с текстурой наложится на предмет.
Хорошо со статическими объектами и неизменным светом. Комп не заморачивается с рассчетом света и может работать быстрее.
Минус - динамические объекты не отбрасывают тени и теряют блеск объекты статические.
Запекание светопроб
Берём точку в пространстве и смотрим, как она освещена. В дальнейшем - динамический объект в этой точке освещен аналогично.
Запекание проб отражений
По факту - "сферический" скриншот, который используется для блеска. Минус - ну оооочень примерно! И динамические объекты не отражаются.
Запекание интерьеров
Когда в окнах или витринах видно интерьер, но... Его там нету!
Это фальшивка: просто хитро наложенная шейдером текстура.
Итого
Сто процентов что-то ещё забыл, но по факту - даже все это современные разработчики часто забывают использовать, надеясь на мощность компа и видяхи!
Подписывайтесь на мою игру "Замок Зеркал" в Стим.
Лайкайте, комментируйте, подписывайтест на блог!
Удачи!