Использование атласа текстур для оптимизации вашей игры

Время. Месяцы. Может быть годы. Вы потратили своё время (много времени), что бы создать свою игру. Маленькая она или большая не имеет значения. Это ваша игра, и теперь вы хотите поделиться ей с миром, и возможно стать известным и богатым. Это идеальный вариант: искусство это хорошо, и вы гордитесь вашими идеями внутри игры. Вашей игры.

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

Не паникуйте: есть простой трюк, который может помочь вам. Она называется «Атлас текстур».

Что такое атлас текстур?

Если вы в первый раз будете разрабатывать 3D видео игру, вы обнаружите, что 3D графика состоит из нескольких частей: 3D сетки, текстур, частиц и многих других элементов, которые обычно рисуются на экране 30 раз в секунду (30 fps) в процессе рендеринга, что делает мир игры разнообразным и живым.

Верьте или нет, но в первой 3D видеоигре, которую я видел в своей жизни не было ни одного из этих элементов. Она была составлена только из линий, которые формируют объекты или каркасные 3D элементы.

Написав это, я почувствовал себя старым.

Возвращаясь к важным вещам, сегодня мы будем говорить о текстурах пользовательского интерфейса (далее UI) и обо всех текстурах в игре.

В 3D игре, пользовательский интерфейс, как правило, состоит из 3D элементов (таких как плоскости или кубы) с текстурами.

Мы уже упоминали процесс рендеринга: это действие, посредствам которого элементы в памяти физически рисуются на экране. Это один из самых сложных и трудоёмких процессов, которые происходят в игре в режиме реального времени. Приветствуется любой способ сокращение времени затраченного на рендеринг; сокращение времени на этапе рендеринга означает более высокую частоту кадров (т.е. если вы дойдете до 60 кадров в секунду, вы сможете рендерить изображение дважды, а затем думать о переносе вашей игры на VR) или добавить больше элементов в вашу игру и сделать её более красивой.

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

Как работает атлас текстур.

Примечание: как уже упоминалось выше, в этой статье пойдёт речь о текстурном атласе применительно к UI. Тем не менее, многие из концепций объясняемых здесь так же могут быть применены к 3D моделям и их текстурам.

Текстурный атлас, как мы уже говорили, представляет собой набор текстур внутри одного изображения.

Атлас обычно ассоциируется с файлом-дискриптором, который указывает игре, где текстуры (с помощью координат X и Y), для того, что бы извлечь нужную текстуру.

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

Способы создания атласа текстур.

Существует много способов создания атласа. Среда разработки как правило, позволяет создавать и управлять атласом; есть так же множество внешних инструментов предоставляющих дополнительные возможности.

Выбор, какую систему использовать, зависит от ваших личных предпочтений. Здесь мы разберём два варианта: Sprite Packer встроенный в Unity и TexturePacker (отдельный платный инструмент).

Sprite Packer

Чтобы открыть Sprite Packer, выберите из меню Window > Sprite Packer.

Управление очень простое: кнопка Pack используется для создания одного или нескольких атласов (это зависит от количества изображений и размера атласа, который хотите использовать).

Теперь вы можете выбрать изображение, что бы увидеть, в каком месте атласа оно находится. Если вы добавляете или удаляете изображения из атласа, вы должны использовать кнопку Repack, что бы обновить атлас.

Для того, что бы настроить Sprite Packer вы можете выбрать из меню Edit > Project Settings > Editor; здесь вы можете отключить атлас, активировать его только для сборки игры иди держать его включённым всегда.

Для получения дополнительной информации о Sprite Packer, вы можете посмотреть официальное руководство.

Texture Packer

Texture Packer — автономный инструмент используемый для управления атласами.

Вы можете добавить одну или несколько папок из вашего проекта и Texture Packer создаст атлас.

После этого, вы можете выбрать формат данных для экспорта. Как вы можете видеть, есть так же вариант «JSON for Unity». Это означает, что вы можете экспортировать атлас для вашего Unity проекта. Но для того, что бы использовать этот формат, вы должны установить бесплатное расширение из asset store.

Для получения дополнительной информации о Texture Packer, вы можете прочитать официальное руководство.

Почему важно пользоваться атласами текстур?

Но почему это так важно, собрать несколько изображений в одно большое?

Давайте вернёмся к процессу рендеринга: если каждый элемент пользовательского интерфейса имеет отдельную текстуру, нужно вызывать метод ортисовки для каждого изображения. Это означает, что если в нашем интерфейсе мы имеем значок сердца (представляющий жизни игрока) и значок собранных монет, метод отрисовки будет вызываться дважды.

На каждый вызов отрисовки требуется время, что делает процесс рендеринга всё длиннее и длиннее. Если есть пять элементов пользовательского интерфейса, а не два как в предыдущем примере, метод отрисовки будет вызван пять раз.

Вы начинаете видеть в этом смысл?

Больше вызовов отрисовки -> больше времени на этапе рендеринга -> меньше кадров в секунду -> игра с низкой частотой кадров (с дропающимися кадрами) или меньшем количеством элементов на экране (что плохо с визуальной части).

Нет причин так делать, особенно для пользовательского интерфейса.

На самом деле, если текстуры будут собраны вместе, они будут отрендерены в один проход.

Вывод

В заключение, особенно если вы разрабатываете игру под платформы где производительность действительно важна (например под мобильные платформы):

  • Вы должны обратить внимание на количество вызовов метода отрисовки: больше вызовов означает более высокое время рендеринга (а это значит риск уменьшения частоты кадров).
  • Как правило каждый объект с отдельной текстурой может генерировать один вызов метода отрисовки (есть некоторые исключения, особенно в случае 3D объектов).
  • Один из способов снизить количество вызовов метода отрисовки заключается в использовании атласа текстур.
  • Текстурный атлас — это большая текстура с группой различных текстур.
  • Все объекты, которые используют один текстурный атлас генерируют только один вызов метода отрисовки.
  • Специально для UI текстур, использование текстурного атласа обязательно для повышения производительности.

И… да прибудет с вами сила. И ваш код. Всегда.

Оригинал.