Маленькие советы по оптимизации игр
Я сейчас работаю над своим terrain и map-editor tools'ами. Это большой объём работы, так что какое-то время мне будет нечего показать.
Уверен, тут много разработчиков. Чтоб канал не пустовал, решил написать 5 простых советов по оптимизации игр для начинающих разрабов:
1. Не нужно выполнять всю логику каждый кадр
Большинству систем хватает 5-30 вызовов в секунду. В Final Divide почти всё, кроме движения, имеет tick (это особенно важно для RTS).
2. Пулинг объектов
Создание большого количества объектов и сборка мусора после их удаления в каждом кадре — очень дорогие операции. В Final Divide я использую централизированную коллекцию пулов для пуль, взрывов, эффектов и всего, что постоянно спавнится и деспавнится. Избавиться от лишних аллокаций можно в местах, где часто создаются массивы и иные структуры данных: лучше один раз закэшировать структуру и реюзать её.
3. Ленивые вычисления
Не нужно считать то, что может не понадобиться. Например, я часто вижу, как при pathfinding кто-то сразу сглаживает и оптимизирует весь путь до конечной точки. Но юнит может прервать движение на середине. Путь можно сглаживать по ходу движения.
4. Не использовать физику без необходимости
Простота использования физики в современных движках привела к тому, что её применяют там, где она совсем не нужна. Во многих RTS, как и в Final Divide, юниты вообще не используют физику. Чтобы "поставить" танк на землю, достаточно найти высоту террейна в 4 точках и снепнуть к ним объект. Добавляем сюда первый совет; а если юнит находится не в кадре, то тик можно ещё и увеличить. Получаем вместо постоянной физической симуляции очень легковесные вычисления.
5. Пространственная кластеризация
Действия большинства игр происходят в пространстве, которое можно разбить на сегменты. Так, обычный A* можно превратить в HPA*. Если юнит ищет ближайшую вражескую цель полным перебором — это экспоненциальная сложность; в Final Divide для каждого entity постоянно определяется, какие кластеры он занимает, а поиск целей происходит по кластерам в радиусе обзора. При перестроении NavMesh я обновляю только затронутые изменениями кластеры. Ну а если вы вдруг решили создать свой собственный физический движок, без этого не обойтись.
А за разработкой Final Divide можно следить тут: