Оптимизация Sausage Sports Club для Nintendo Switch

Я уже некоторое время работаю над версией Switch для Sausage Sports Club, и заставить ее хорошо работать было большим волосатым зверем. Частично эта проблема заключается в том, что ресурсов по оптимизации игр Unity немного, и отчасти это связано с закрытым исходным кодом разработки консолей. Итак, я хочу поделиться некоторыми извлеченными уроками (в дружественной форме NDA). Задавайте мне вопросы в комментариях или на @chriswade__ в Твиттере.

Игровая логика

  • Прежде всего, познакомьтесь с профилировщиком Unity. Здесь началась большая часть собранной мной информации об улучшении производительности моей игры. Виджет использования ЦП показывает все вызовы функций из источника Unity, сколько раз они вызывались, сколько времени в миллисекундах и% занятого ими кадра и сколько мусора они создали. Также есть график, который показывает визуальное распределение того, как было потрачено время кадра между рендерингом, физикой, скриптами и накладными расходами, связанными с профилированием.

  • Некоторые вещи, которые не являются заметно дорогими на ПК или других консольных платформах, на Switch стоят дорого. Проверка на нуль, Vector.magnitude / sqrMagnitude, Quaternion.Euler, Quaternion.LookRotation, установка transform.position / rotation (localPosition / localRotation в порядке), установка твердого тела.velocity / angularVelocity - все это были призывы, которые мне пришлось замедлить.
  • Тесты скорости на устройстве очень важны при разработке для консолей. Их низкоуровневые библиотеки работают не так, как мой компьютер для разработки, поэтому я держу второй (в основном пустой) проект, в котором я тестирую идеи о производительности и функциональности Switch, не дожидаясь 10 минут сборки / развертывания моей игры.

Сборка мусора

  • GC.Collect заставит вашу частоту кадров зависать и запускается автоматически, если создается слишком много мусора.
  • Ваша цель - создать нулевой мусор в активной сцене. На самом деле это невозможно, если вы используете сопрограммы или большинство плагинов хранилища ресурсов, но ваши вызовы Update должны быть свободными от мусора.
  • В начале игры выделите огромный кусок памяти, чтобы увеличить коллекцию сборщика мусора, чтобы автоматическая очистка происходила реже.
  • Звоните в GC. Собирайтесь в местах, где низкая частота кадров незаметна (при смене сцены, при открытии меню и т. Д.).
  • Объединение объектов в пул является обязательным, поскольку создание и уничтожение объектов занимает много времени и создает мусор. Я рекомендую эту старую, но все еще хорошую систему: https://github.com/UnityPatterns/ObjectPool/tree/master/Assets/ObjectPool

Физика

  • Опять же, познакомьтесь с профилировщиком Unity. Есть виджет Physics, который показывает количество активных динамических / кинематических параметров, статических коллайдеров, твердых тел, перекрытий триггеров, активных ограничений и контактов на кадр. Для моей игры наличие более 150 динамиков, 20 перекрытий триггеров или 500 контактов на кадр является признаком проблем.

  • Первый простой шаг - убедиться, что у вас есть разумная физическая матрица столкновений. Убедитесь, что объекты, которые не должны / не могут столкнуться, не проверяются на столкновение.
  • Множество больших триггеров очень опасны и будут накладываться на множество вещей и увеличивать ваше физическое время.
  • Столкновение - экспоненциальная проблема, потому что все коллайдеры разрешаются против всех других коллайдеров. Один из самых простых способов оптимизировать физику - отключить / удалить ненужные коллайдеры или физические объекты.

Обработка

  • Опять таки! Познакомьтесь с профилировщиком Unity. Виджет «Рендеринг» позволяет вам видеть в реальном времени, сколько вызовов отрисовки происходит в каждом кадре, сколько из них динамически, статически группируется и сколько объектов было создано. Также есть информация о видеопамяти, но мне не о чем беспокоиться.

  • Также ознакомьтесь с отладчиком кадров, который показывает пошаговый упорядоченный список всех шагов рендеринга этого кадра. Он даже группируется по очередям рендеринга и показывает различные камеры, эффекты изображения и количество пакетов / экземпляров для каждого объекта. Что касается оптимизации, этот инструмент лучше всего подходит для решения проблем пакетной обработки и создания экземпляров.

  • Overdraw убивает время рендеринга. Для каждого смешанного квадрата или сетки с альфа-частицами, помещенных друг на друга, занятые пиксели должны быть отрисованы снова. Даже на экране коммутатора с разрешением 1280 x 720 эта стоимость быстро увеличивается.
  • Вы можете проверить перерисовку с помощью раскрывающегося меню типа рендеринга перерисовки в представлении сцены. Также, если вы поворачиваете камеру, и игра внезапно тормозит, это, вероятно, перебор.

  • Точно так же дорогие шейдеры с большим количеством операций чтения текстур и инструкций могут иметь мультипликативный эффект. Отрисовка того же количества пикселей теперь занимает в два раза больше времени, потому что вы отправляете вдвое больше инструкций на графический процессор. Это сложнее отлаживать из Unity, но мне удалось использовать отладчик Tegra Graphics, чтобы проверить, какие шейдеры имеют больше операций, чем встроенные шейдеры: https://developer.nvidia.com/tegra-graphics-debugger

Последние мысли

  • Ваше время более важно, чем время кадра. Иногда вы слышите или обнаруживаете способ немного улучшить производительность всей игры. Но обязательно проверьте, что оптимизация действительно вернет достаточно времени, чтобы оправдать работу. Много раз я обнаруживал незначительную оптимизацию и терял день, применяя этот урок во всей игре, и обнаруживал, что возвращаю только 0,02 миллисекунды.
  • Добавьте команды отладки в настройки тестирования во время сборки. Сколько времени на физику я верну, если отключу половину этих игрушек? LT + RT + Y. Сколько времени я получил бы без графических эффектов? LT + RT + X.
  • Остерегайтесь ошибок, которые могут возникнуть при переписывании логики, изменении матриц столкновений и удалении / упрощении коллайдеров. Их будет много, и большинство из них будут достаточно маленькими, чтобы сразу не заметить. QA - ваш друг.
  • Не полагайтесь на плагины черного ящика, потому что у них могут быть проблемы с производительностью, которые вы не сможете исправить.