Hero background image

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

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

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

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

Скриншот редактора Unity
ИЗОБРАЖЕНИЕ ИЗ LOST CRYPT — НОВОГО 2D-ПРОЕКТА ДЛЯ UNITY
Общие советы по производительности

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

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

Дополнительные советы по оптимизации 2D см. на следующих ресурсах:

Unity — быстрая разработки 2D-игр с Tilemap
ПРИМЕР ТАЙЛОВОЙ КАРТЫ
Краткое введение в Tilemap

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

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

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

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

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

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

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

Для сравнения, Tilemap использует один рендерер для всей карты и всех ее фрагментов. Это приводит к меньшим накладным расходам, поскольку он обрабатывает только свои собственные структуры данных по сравнению с использованием нескольких структур данных в памяти.

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

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

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

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

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

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

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

Из этого сравнения становится ясно, сколько работы предстоит выполнить сериализации Sprite. В частности, файл сцены с использованием Sprites содержит 370 000 строк, а сцена с Tilemaps — 30 000 строк. Меньшие размеры проектов и репозиториев приводят к сокращению времени итераций и более плавным рабочим процессам.

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

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

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

Примеры использования Tilemap
СРАВНЕНИЕ ИСПОЛЬЗОВАНИЯ ОТДЕЛЬНЫХ GAMEOBJECTS СО SPRITE RENDERER С ИСПОЛЬЗОВАНИЕМ TILEMAP
Снижение затрат на рендеринг

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

Снижена стоимость выбраковки

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

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

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

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

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

Сцены с использованием таблицы спрайтов и тайловых карт
Более высокая частота кадров

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

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

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

Демонстрация спрайта Атласа
ИСПОЛЬЗОВАНИЕ SPRITE ATLAS В DRAGON CRASHERS
Упаковка спрайтов с помощью Sprite Atlas

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

Дополнительные ресурсы для создателей 2D-игр

Станьте мастером 2D В нашем списке для чтения в блоге представлены полезные советы по разработке 2D-игр.

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

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

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

Был ли этот контент полезен?