Методы наиболее успешной практики для работы с данными текстуры

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

Текстуры загрузки во время инициализации

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

После того, как Вы создаете текстуру, избегаете изменять ее кроме вначале или конец кадра. В настоящее время все устройства на iOS используют основанное на мозаике задержанное средство рендеринга, сделав звонки к glTexSubImage и glCopyTexSubImage особенно дорогие функции. Посмотрите Основанный на мозаике Задержанный Рендеринг для получения дополнительной информации.

Используйте платформу GLKit для загрузки данных текстуры

Загрузка данных текстуры является фундаментальной работой, которая важна для разбираний. Используя платформу GLKit, GLKTextureLoader класс делает создание и загрузку новых текстур простыми. GLKTextureLoader класс может загрузить данные текстуры из множества источников, включая файлы, URLs, представления в оперативной памяти и CGImages. Независимо от входного источника, GLKTextureLoader класс создает и загружает новую текстуру из данных и возвращает информацию о текстуре как a GLKTextureInfo объект. Свойства GLKTextureInfo к объектам можно получить доступ для выполнения различных задач, включая привязку текстуры к контексту и включению его для рисования.

Перечисление 9-1 представляет типичную стратегию загрузить новую текстуру из файла и связать и включить текстуру для более позднего использования.

Перечисление 9-1  , Загружающее двумерную текстуру из файла

GLKTextureInfo *spriteTexture;
NSError *theError;
 
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Sprite" ofType:@"png"]; // 1
 
spriteTexture = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:&theError]; // 2
glBindTexture(spriteTexture.target, spriteTexture.name); // 3
glEnable(spriteTexture.target); // 4

Вот то, что код делает, соответствуя пронумерованным шагам в перечислении:

  1. Создайте путь к изображению, содержащему данные текстуры. Этот путь передается в качестве параметра GLKTextureLoader метод класса textureWithContentsOfFile:options:error:.

  2. Загрузите новую текстуру из файла образа и храните информацию текстуры в a GLKTextureInfo объект. Существует множество доступных опций загрузки текстуры. Для получения дополнительной информации посмотрите Ссылку класса GLKTextureLoader.

  3. Свяжите текстуру с контекстом, с помощью надлежащих свойств GLKTextureInfo возразите как параметры.

  4. Включите использование текстуры для рисования использования надлежащего свойства GLKTextureInfo объект в качестве параметра.

GLKTextureLoader класс может также загрузить текстуры cubemap в наиболее распространенных форматах изображения. И, если Ваше приложение должно загрузить и создать новые текстуры при выполнении, GLKTextureLoader класс также обеспечивает методы для асинхронной загрузки текстуры. Посмотрите Ссылку класса GLKTextureLoader для получения дополнительной информации.

Сократите использование памяти текстуры

Сокращение объема памяти, который использует Ваше приложение для iOS, всегда является важной частью настройки Вашего приложения. Однако OpenGL , приложение ES также ограничивается в общей сумме памяти, которую это может использовать для загрузки текстур. Где возможно, Ваше приложение должно всегда пытаться сократить объем памяти, который оно использует для содержания данных текстуры. Сокращение памяти, используемой текстурой, почти всегда за счет качества изображения, таким образом, необходимо сбалансировать любые изменения приложение делает к его текстурам с уровнем качества представленного кадра финала. Для лучших результатов попробуйте методы, описанные ниже, и выберите тот, обеспечивающий лучшие сбережения памяти на допустимом уровне качества.

Текстуры сжатия

Сжатие текстуры обычно обеспечивает лучший баланс сбережений памяти и качества. OpenGL ES для iOS поддерживает многократные сжатые форматы текстур.

Все устройства на iOS поддерживают Сжатие Текстуры PowerVR (PVRTC) формат путем реализации расширения GL_IMG_texture_compression_pvrtc. Существует два уровня сжатия PVRTC, 4 бита на пиксель и 2 бита на пиксель, предлагающие 8:1 и 16:1 коэффициент сжатия по несжатому 32-разрядному формату текстур соответственно. Сжатая текстура PVRTC все еще обеспечивает достойный уровень качества, особенно на 4-разрядном уровне. Для получения дополнительной информации о сжатии текстур в формат PVRTC посмотрите Используя texturetool для Сжатия Текстур.

 OpenGL ES 3.0 также поддерживает ETC2, и EAC сжал форматы текстур; однако, текстуры PVRTC рекомендуются на устройствах на iOS.

Используйте цветные форматы Более низкой Точности

Если Ваше приложение не может использовать сжатые текстуры, рассмотрите использование более низкого формата пикселя точности. Текстура в RGB565, RGBA5551 или RGBA4444 форматирует использование половина памяти текстуры в формате RGBA8888. Используйте RGBA8888 только, когда для Вашего приложения будет нужен тот уровень качества.

Использование должным образом размерные текстуры

Изображения, что основанное на iOS устройство дисплеи является очень маленьким. Ваше приложение не должно обеспечивать большие текстуры для представления приемлемых изображений экрану. Сокращение вдвое обеих размерностей текстуры сокращает объем памяти, необходимый для той текстуры к одной четверти та из исходной текстуры.

Прежде, чем уменьшить Ваши текстуры, попытайтесь сжать текстуру или использовать цветной формат более низкой точности сначала. Текстура, сжатая с форматом PVRTC обычно, обеспечивает более высокое качество изображения, чем уменьшение текстуры — и это использует меньше памяти также!

Текстуры объединения в атласы текстуры

Привязка с текстурой занимает время для OpenGL ES для обработки. Приложения, сокращающие количество изменений, они делают к OpenGL состояние ES, выполняют лучше. Для текстур один способ избежать связывать с новыми текстурами состоит в том, чтобы объединить многократные меньшие текстуры в единственную большую текстуру, известную как атлас текстуры. При использовании атласа текстуры можно связать единственную текстуру и затем выполнить многократные вызовы получения, использующие ту текстуру, или даже объединяющие многократные вызовы получения в единственный вызов получения. Координаты текстуры, предоставленные в Ваших данных вершины, изменяются для выбора меньшей части текстуры из атласа.

../Art/texture_atlas_2x.png../Art/texture_atlas_2x.png

Атласы текстуры имеют несколько ограничений:

 Xcode 5 может автоматически создать атласы текстуры для Вас от набора изображений. Для получения дополнительной информации при создании атласа текстуры, посмотрите Справку Атласа Текстуры. Эта функция предоставлена прежде всего для разработчиков, использующих платформу Набора Sprite, но любое приложение может использовать файлы атласа текстуры, которые это производит. Для каждого .atlas папка в Вашем проекте, XCode создает a .atlasc папка в Вашем комплекте приложений, содержа один или несколько скомпилированные изображения атласа и список свойств (.plist) файл. Файл списка свойств описывает отдельные изображения, составляющие атлас и их расположения в изображении атласа — можно использовать эту информацию для вычисления надлежащих координат текстуры для использования в OpenGL получение ES.

Используйте множественное отображение для сокращения использования пропускной способности памяти

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

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

При объединении mip карт с атласами текстуры, используйте TEXTURE_MAX_LEVEL параметр в OpenGL ES 3.0, чтобы управлять, как отфильтрованы Ваши текстуры. (Эта функциональность также доступна в OpenGL ES 1.1 и 2.0 через APPLE_texture_max_level расширение.)

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

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

Весь OpenGL реализации ES на iOS поддерживают по крайней мере два модуля текстуры и большинство устройств, поддерживает по крайней мере восемь. Ваше приложение должно использовать эти модули текстуры для выполнения как можно большего количества шагов в алгоритме в каждой передаче. Можно получить число модулей текстуры, доступных приложению путем вызова glGetIntegerv функция, передающая в GL_MAX_TEXTURE_UNITS как параметр.

Если Ваше приложение требует, чтобы многократные передачи представили отдельный объект: