Всегда есть что оптимизировать
Поддержите разработчиков — страница игры на UEDC 2020
О, это красивое слово "оптимизация"! Только произнес — и сразу повеяло ветром перемен к лучшему. Всегда можно что-нибудь улучшить, чтобы повысить производительность, но главный вопрос — насколько комплексно нужно это делать? Можно пересмотреть множество различных аспектов, но всегда следует помнить суть и контекст, в котором будет использоваться дизайн. Зачастую в ходе поиска технических решений люди подменяют контекст проблемы, потому что так легче понять ее и ассоциировать с чем-то, находящимся в поле своей деятельности. Так происходит потому, что человеческий мозг, как и всё в этом мире, ищет путь наименьшего сопротивления. Отсюда следует, что всегда продуктивнее разбирать проблему коллективно: совместно с автором механики (фичи, тулзы), исполнителями и их руководителями.
Мы в команде разработки адвенчуры Sayri: The Beginning не стесняемся протипировать и не ограничиваем себя в технических решениях. Порой мы получаем весьма информативный, но абсолютно не оптимизированный прототип. Впоследствии даже при имплементации в игру не всегда получается выбрать для фичи или механики идеальное техническое решение, которое будет учитывать развитие проекта в будущих этапах продакшена.
Поэтому в нашей команде был разработан план работы над оптимизацией существующих ассетов и инструментов. Для примера возьмем ассет “Спайки”.
Конструктивный анализ ассета
При разработке технического решения для спайков мы совершили ошибку, которая поначалу была несущественной и при хорошем левел-дизайне приводила лишь к небольшим просадкам FPS. Этой ошибкой было использование скелетал мешей. Если точнее — скелетл меши для морф анимации. Скелет очень простенький, в одну кость. Мы использовали каждый морф как ключевую позу в анимации, а смена между морфами заполняет переходные кадры между позами.
Мы хотели использовать морф анимации для статик мешей, как это сделали GIANT SQUID в ABZU. Но поскольку такой тул разрабатывается специально для игры, мы приняли решение на стадии демо-версии не тратить время на создание уникальных инструментов и вернуться к этому вопросу в период продакшена. Больше деталей об этом решении его авторы рассказали на GDC 2017 в своей лекции Creating the Art of ABZU.
Такой инструмент может помочь существенно улучшить производительность за счет устранения скелетных анимаций в игре. К примеру, птицы, рыбы, улитки, черепахи, мухи, змеи, ящерицы, крабы и другие мелкие животные, а также растения или интерактивные объекты, которые могут невероятно оживить мир игры.
Но вернемся к нашей ситуации. Пока мы думали над техническим решением, скелетл мешей у нас было не так много. Однако со временем мы добавили прототипы улиток, черепах, мух, рыб, птиц, зайцев, гномов — и целый пакет интерактивных объектов для пазлов (пока что они, конечно, на скелетной анимации, потому что так было легче прототипировать результат). И тут FPS сказал: "Прощай".
Так как разработка ведется постоянно, все ассеты дополняются и развиваются в процессе разработки игрового дизайна, большую их часть финализировать мы не можем. Но такие ассеты, как спайки — простые, гибкие в своем дизайне и уже устоявшиеся — вполне могут быть финализированы и оптимизированы.
Но как?
Окей, мы не можем использовать скелетную анимацию и морф анимацию, потому что для нее тоже нужен скелет минимум из одной кости. Через материал можно деформировать меш и проводить ряд манипуляций, что подходит для простых или цикличных анимаций.
Для выполнения задачи нам нужно сделать что-то похожее на анимацию роста, а затем проиграть ее в обратном порядке.
Мы нашли следующие варианты:
Первый. Можно написать плагин для MAYA, который будет запекать изменения меша на UV, после чего с помощью material function в движке вызывать разные стейты и запускать по очереди для проигрывания анимации. Проще говоря, это аналог морф анимации, но со статик мешем. Вот в этом видео подробно объясняют, как можно это сделать. Вариант хорош во всем, но нужно дописать маленький тул для MAYA.
Второй. Можно использовать интересный плагин Static Mesh Swapper от Elhoussine Mehnik. Интересная находка, но по тестам мы смогли улучшить производительность спайков лишь в 1,5-2 раза. По нашему мнению, этот плагин еще требует доработок для внедрения в продакшен.
Третий вариант — использовать Static Mesh Morph, как предлагает Epic Games. Логика очень похожа на вариант №1, но возможности не такие широкие. Здесь нас не вполне устраивает ограничение на количество морфов до 3-х штук, потому что это не совсем гибко для создания анимаций. Этот вариант, как и первый, требует в 10 раз меньше ресурсов, чем скелетная анимация.
Мы выбрали третий вариант. Чтобы компенсировать ограниченное количество морфов для статик меша, мы подкорректировали дизайн спайков, а также увеличили количество спайков в одном месте. Все заняло полтора-два дня — по времени этот вариант был самым выгодным.
Результаты
В среднем по больнице мы выиграли целых 15 FPS, что не может нас не радовать.
Теперь это — movable static mesh, у которого отключены тени (зачем нужны черные тени на черном фоне?), и это означает, что количество спайков почти не влияет на производительность, даже если их действительно много.
Это решение и его результаты подготовили нас к процессу оптимизации животных, который требует куда более комплексных решений, но об этом мы поговорим в другой раз.
Мораль!
Любые технические решения имеют последствия, и всегда лучше уточнять детали по пайплайну с другими членами команды: даже если пайплайн устоявшийся, лишний раз проверить стоит. Сила хорошего проекта — в слаженной работе команды и грамотном планировании.
Поддержите разработчиков — страница игры на UEDC 2020