Hero background image

Оптимизация производительности 2D-игр с Unity Tilemap

Получите советы по улучшению производительности ваших 2D-игр и мобильных приложений с помощью Unity Tilemap. Темы, рассмотренные здесь, включают размер сцены, сериализацию, потребление ресурсов рендерера и пакетирование.
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

Эти советы лучше всего подойдут пользователям, имеющим некоторый опыт работы с инструментами 2D в Unity. Еще один отличный ресурс для профессиональных создателей, разрабатывающих коммерческие 2D-игры с помощью Unity, — это наша электронная книга, 2D-арт игр, освещение и анимация.

Если вы новичок в разработке 2D-игр с помощью Unity, начните с руководства по 2D для новых пользователей.

Скриншот редактора Unity
ИЗОБРАЖЕНИЕ ИЗ 2D-ПРОЕКТА UNITY LOST CRYPT

Общие советы по производительности

Вот несколько общих советов по производительности, которые стоит учитывать:

  • Думайте о производительности ваших активов (данных) с самого начала. Если эти элементы неэффективны, вы сможете сделать мало для оптимизации вашего кода позже.
  • Профиль на вашем самом низком доступном целевом устройстве. Используйте Профайлер Unity на протяжении всего процесса разработки проекта, а также инструменты профилирования, специфичные для платформы, такие как Xcode для устройств iOS.
  • Не используйте более трети доступной оперативной памяти на вашем самом низком целевом устройстве. Это гарантирует, что ваш контент будет хорошо работать на широком спектре мобильных устройств (дешевые Android-телефоны по-прежнему остаются самыми популярными на мобильных рынках).

Для получения дополнительных советов по оптимизации 2D, смотрите эти ресурсы:

Unity — быстрая разработки 2D-игр с Tilemap
ПРИМЕР ТАЙЛМЭПА

Краткое введение в Tilemap

Компонент Tilemap позволяет эффективно создавать 2D уровни, используя плитки на наложенной сетке. Он состоит из нескольких элементов, включая:

Вы можете создавать 2D уровни, используя комбинацию спрайтов и игровых объектов, и контролировать такие свойства, как слои сортировки, коллайдеры тайловой карты и анимированные плитки, среди прочего. Вы также можете рисовать Квадратные, Шестиугольные и Изометрические спрайты.

Рисуйте свои уровни с помощью Tilemap, чтобы компонент коллайдера Tilemap 2D автоматически генерировал коллайдер вокруг плиток (на основе настройки типа коллайдера плитки), когда он применяется к игровому объекту Tilemap.

Давайте посмотрим на прирост производительности, который вы получаете с помощью Tilemap по сравнению с сценами, построенными с использованием спрайтов.

Tilemap с меньшим числом объектов
TILEMAP В 2D-ДЕМОНСТРАЦИИ UNITY DRAGON CRASHERS

Меньше GameObjects

Использование Tilemap уменьшает время загрузки, а также использование памяти и ЦП.

Если вы ранее разрабатывали 2D-игры и приложения, то знаете, что в вашей игре может оказаться большое количество спрайтов, каждый из которых является отдельным GameObject. На каждом из этих GameObject спрайтов есть компоненты, включая Transform и Renderer, которые занимают память. Другие компоненты, такие как Colliders, имеют накладные расходы на ЦП.

В сравнении, Tilemap использует один Renderer для всей карты и всех ее плиток. Это приводит к меньшим накладным расходам, так как он обрабатывает только свои собственные структуры данных, в отличие от наличия множества структур данных в памяти.

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

Unity — уменьшение объема сцены с помощью Tilemap
СРАВНЕНИЕ ДВУХ СЕРИАЛИЗОВАННЫХ ФАЙЛОВ, ОДИН СОЗДАН С ИСПОЛЬЗОВАНИЕМ СПРАЙТОВ (СЛЕВА), А ДРУГОЙ С ИСПОЛЬЗОВАНИЕМ TILEMAPS (СПРАВА)

Меньший размер сцены

Tilemap Unity уменьшает размер сцены. Меньшее количество GameObject и компонентов означает меньше объектов для загрузки с диска, десериализации и хранения в памяти во время выполнения.

Загрузка сцен в Unity — это двухэтапный процесс: Сначала данные считываются с диска. Это процесс, который часто занимает больше всего времени в вашей игре, особенно на устройствах Android. Затем данные десериализуются. Десериализация — это процесс преобразования данных из одного формата в другой. По сути, это восстанавливает данные и объекты из сохраненного состояния. Unity выполняет сериализацию внутренне, так что каждый раз, когда он загружает файл сцены в редакторе и во время выполнения, он берет эти сохраненные файлы и превращает их в объекты Unity.

На изображении выше вы можете увидеть сравнение между двумя сериализованными файлами сцены, один из которых использует Tilemaps, а другой воссоздан с использованием спрайтов. Спасибо Pixel Reign за эту сцену из их игры Robbie Swifthand.

Справа находится раздел сериализованного Tilemap, состоящий из четырех тайлов. Правила для всех тайлов, включая тип используемых тайлов, установлены в верхней части Tilemap. Каждый из последующих тайлов указывает свойства, такие как используемый тайл и его позиция.

Слева изображен один спрайт с компонентами Transform и Sprite Renderer.

Из этого сравнения ясно, сколько работы необходимо для сериализации спрайтов. В частности, сцена с использованием спрайтов имеет 370 000 строк в своем файле, в то время как сцена с Tilemap имеет 30 000 строк. Меньшие размеры проектов и репозиториев приводят к более быстрым временам итерации и более плавным рабочим процессам.

Если вы хотите просмотреть свои сцены в текстовом файле, перейдите в Настройки редактора, включите Режим сериализации ассетов, нажмите на Force Text и откройте файл сцены .unity в Текстовом редакторе.

Unity — уменьшение числа коллайдеров с помощью Tilemap
КОЛЛАЙДЕР TILEMAP 2D В СОЧЕТАНИИ С КОМПОЗИТНЫМ КОЛЛАЙДЕРОМ 2D

Меньше коллайдеров

Вы можете объединить коллайдер Tilemap 2D с композитным коллайдером. Это не только уменьшит количество коллайдеров и спрайтов, но и повысит эффективность вашего производства, так как не нужно будет каждый раз заново строить сложные формы столкновений при внесении изменений. Композитный коллайдер заботится об этом.

Примеры использования Tilemap
СЛУЧАЙ ИСПОЛЬЗОВАНИЯ ДЛЯ ОТДЕЛЬНЫХ GAMEOBJECT С ИХ SPRITE RENDERER ПРОТИВ TILEMAP

Сниженное потребление ресурсов рендеринга

Как уже упоминалось ранее, у каждого спрайта есть компонент Sprite Renderer, и наличие большего количества рендеров требует больше работы от ЦП, включая время на подготовку отсечения и очистку для рендеринга. Используя Tilemaps, вы получите меньше компонентов рендерера, тем самым сэкономив работу ЦП.

Сниженные затраты на отсечение

Более одной камеры в вашей сцене означает больше рендеров. Это увеличивает стоимость отсечения.

В режиме просмотра камеры существует стоимость отсечения для каждого рендерера и каждой камеры. Каждая камера должна выполнять проверки отсечения для каждого компонента рендерера в сцене, поэтому, если у вас есть многокамерная установка для вашей игры, использование Tilemaps поможет вам снизить эту стоимость.

сокращение вызовов сборки пакетов
ОТЛАДЧИК КАДРОВ

Меньше вызовов пакетирования

Сборка — это объединение всей геометрии, которую можно нарисовать, без выполнения другого вызова SetPass. Рендерер тайловой карты объединяет геометрию спрайтов на основе их положения. В результате рендерер тайловой карты отправляет меньше мешей с большей геометрией в конвейер рендеринга, по сравнению с рендерером спрайтов, который отправляет больше мешей с меньшей геометрией. Как показывает таблица в следующем разделе, сцена на основе тайловой карты имеет значительно меньшее количество сборок.

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

Сцены с таблицей спрайтов и тайлов.

Более высокая частота кадров

Чтобы достичь 60 fps, каждый кадр может занимать максимум 16 мс для рендеринга. Когда образец сцены был профилирован на старом iPhone 7, версия на основе спрайтов имела 244 мс на кадр, в то время как версия на основе тайловой карты имела 13 мс на кадр.

Наконец, использование ОЗУ составило 1,1 ГБ для сцены на основе спрайтов, что слишком много для телефонов Android начального уровня, например. Сцена на основе тайловой карты использовала всего 21 МБ ОЗУ, что делает ее подходящей для работы на более широком диапазоне мобильных устройств.

Сравнение выше показывает явную разницу в производительности между двумя сценами.

Демо-версия атласа спрайтов.
ИСПОЛЬЗОВАНИЕ АТЛАСА СПРАЙТОВ В DRAGON CRASHERS.

Упакуйте спрайты с помощью Sprite Atlas

Атлас спрайтов — это инструмент редактора, который позволяет вам упаковывать ваши спрайты в текстуры для оптимизации использования памяти и вызовов отрисовки. Создайте актив, атлас спрайтов, который включает все спрайты, используемые в вашей тайловой карте, чтобы их можно было объединить рендерером тайловой карты всего в один вызов отрисовки (при условии, что все спрайты помещаются в одну текстуру).

Больше ресурсов для создателей 2D-игр

Улучшите свои 2D навыки: Наш список чтения блога предоставляет полезные советы по разработке 2D игр.

2D Игровая графика, анимация и освещение для художников: Эта бесплатная электронная книга предоставляет лучшие практики для максимального использования инструментов 2D в Unity.

Обзор инструментов 2D: Посмотрите наш удобный обзор того, что Unity предлагает разработчикам 2D.

Процедурные шаблоны с Tilemaps – Часть I и Часть II: Добавьте разнообразия в вашу игру с помощью процедурной генерации. Эти посты объясняют некоторые алгоритмы, которые вы можете использовать с Tilemap и RuleTile.

Оптимизация производительности 2D-игр с Unity Tilemap