Оптимизация производительности 2D-игр с Unity Tilemap
Эти советы лучше всего подойдут пользователям, имеющим некоторый опыт работы с набором 2D-инструментов Unity. Еще один замечательный ресурс для профессиональных авторов, разрабатывающих коммерческие 2D-игры с помощью Unity, — это наша электронная книга, 2D-игровое оформление, освещение и анимация.
Если вы новичок в разработке 2D-игр с помощью Unity, начните с руководства по 2D для новых пользователей.
Вот несколько общих советов по повышению производительности, которые следует учитывать:
- Подумайте о производительности ваших активов (данных) с самого начала. Если эти элементы неэффективны, вы мало что сможете сделать позже для оптимизации своего кода.
- Профиль на самом низком доступном целевом устройстве. Используйте Unity Profiler во время разработки проекта, а также инструменты профилирования для конкретной платформы, такие как Xcode для устройств iOS.
- Не используйте более трети доступной оперативной памяти на целевом устройстве самого низкого уровня. Это гарантирует, что ваш контент будет хорошо работать на широком спектре мобильных устройств (недорогие телефоны Android по-прежнему остаются самыми популярными на мобильных рынках).
Дополнительные советы по оптимизации 2D см. на следующих ресурсах:
Компонент Tilemap позволяет эффективно создавать 2D-уровни, используя плитки на наложенной сетке. Он включает в себя ряд элементов, в том числе:
Вы можете создавать 2D-уровни, используя комбинацию спрайтов и игровых объектов, а также управлять такими свойствами, как слои сортировки, коллайдеры тайловых карт и анимированные плитки и другие. Вы также можете рисовать квадратные, шестиугольныеи изометрические спрайты.
Нарисуйте свои уровни с помощью Tilemap, чтобы компонент Tilemap Collider 2D автоматически генерировал коллайдер вокруг плиток (на основе настройки типа коллайдера Tile) при применении к игровому объекту Tilemap.
Давайте посмотрим на прирост производительности, который вы получаете с помощью Tilemap по сравнению со сценами, созданными с помощью спрайтов.
Использование Tilemap сокращает время загрузки, а также использование памяти и процессора.
Если вы раньше разрабатывали 2D-игры и приложения, то знаете, что в вашей игре может оказаться большое количество спрайтов, причем все они будут представлять собой отдельные игровые объекты. В каждом из этих игровых объектов Sprite есть компоненты, включая Transform и Renderer, которые занимают память. Другие компоненты, такие как коллайдеры, требуют дополнительной нагрузки на процессор.
Для сравнения, Tilemap использует один рендерер для всей карты и всех ее фрагментов. Это приводит к меньшим накладным расходам, поскольку он обрабатывает только свои собственные структуры данных по сравнению с использованием нескольких структур данных в памяти.
Меньшее количество GameObjects приводит к более чистой иерархии, а это означает, что вам не придется прокручивать сложный список, пытаясь найти то, что вам нужно.
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 в текстовом редакторе.
Вы можете объединить Tilemap Collider 2D с составным коллайдером. Это не только уменьшит количество коллайдеров и спрайтов, но и повысит эффективность вашего производства, поскольку нет необходимости перестраивать сложные формы столкновений каждый раз, когда вы вносите изменения. Об этом позаботится Композитный Коллайдер.
Как упоминалось ранее, каждый спрайт имеет компонент 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 — это инструмент-редактор, который позволяет упаковывать спрайты в текстуры для оптимизации использования памяти и вызовов отрисовки. Создайте ресурс Sprite Atlas, который включает в себя все спрайты, используемые в вашей Tilemap, чтобы их можно было объединить с помощью Tilemap Renderer всего за один вызов отрисовки (при условии, что все спрайты помещаются в одну текстуру).
Станьте мастером 2D В нашем списке для чтения в блоге представлены полезные советы по разработке 2D-игр.
Игровая 2D-графика, анимация и освещение для художников В этой бесплатной электронной книге представлены лучшие практики, позволяющие максимально эффективно использовать набор инструментов Unity для 2D-графики.
Обзор 2D-инструментов: Ознакомьтесь с нашим удобным обзором того, что Unity может предложить 2D-разработчикам.
Процедурные шаблоны с Tilemaps – Часть I и Часть II: Добавьте разнообразия в свою игру с помощью процедурной генерации. В этих сообщениях объясняются некоторые алгоритмы, которые вы можете использовать с Tilemap и RuleTile.