Методы наиболее успешной практики для работы с данными текстуры
Данные текстуры часто являются самой большой частью данных Ваше использование приложения для рендеринга кадра; текстуры обеспечивают подробность, требуемую представить большие изображения пользователю. Для вытаскивания самой лучшей производительности из приложения управляйте текстурами приложения тщательно. Суммировать инструкции:
Создайте свои текстуры, когда Ваше приложение инициализируется, и никогда не изменяйте их в цикле рендеринга.
Сократите объем памяти Ваше использование текстур.
Объедините меньшие текстуры в больший атлас текстуры.
Используйте множественно отображается для сокращения пропускной способности, требуемой выбирать данные текстуры.
Используйте мультитекстурирование для выполнения операций текстурирования в единственной передаче.
Текстуры загрузки во время инициализации
Создание и загрузка текстур являются дорогой работой. Для лучших результатов избегите создавать новые текстуры, в то время как работает Ваше приложение. Вместо этого создайте и загрузите свои данные текстуры во время инициализации.
После того, как Вы создаете текстуру, избегаете изменять ее кроме вначале или конец кадра. В настоящее время все устройства на 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 |
Вот то, что код делает, соответствуя пронумерованным шагам в перечислении:
Создайте путь к изображению, содержащему данные текстуры. Этот путь передается в качестве параметра
GLKTextureLoader
метод классаtextureWithContentsOfFile:options:error:
.Загрузите новую текстуру из файла образа и храните информацию текстуры в a
GLKTextureInfo
объект. Существует множество доступных опций загрузки текстуры. Для получения дополнительной информации посмотрите Ссылку класса GLKTextureLoader.Свяжите текстуру с контекстом, с помощью надлежащих свойств
GLKTextureInfo
возразите как параметры.Включите использование текстуры для рисования использования надлежащего свойства
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, выполняют лучше. Для текстур один способ избежать связывать с новыми текстурами состоит в том, чтобы объединить многократные меньшие текстуры в единственную большую текстуру, известную как атлас текстуры. При использовании атласа текстуры можно связать единственную текстуру и затем выполнить многократные вызовы получения, использующие ту текстуру, или даже объединяющие многократные вызовы получения в единственный вызов получения. Координаты текстуры, предоставленные в Ваших данных вершины, изменяются для выбора меньшей части текстуры из атласа.
Атласы текстуры имеют несколько ограничений:
Если Вы используете, Вы не можете использовать атлас текстуры
GL_REPEAT
текстурируйте параметр обертки.Фильтрация может иногда выбирать элементы текстуры вне ожидаемого диапазона. Для использования тех текстур в атласе текстуры необходимо поместить дополнение между текстурами, составляющими атлас текстуры.
Поскольку атлас текстуры является все еще текстурой, это подвергается OpenGL размер текстуры максимума реализации ES, а также другие атрибуты текстуры.
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
как параметр.
Если Ваше приложение требует, чтобы многократные передачи представили отдельный объект:
Гарантируйте, что данные позиции остаются неизменными для каждой передачи.
На втором и более позднем этапе протестируйте на пиксели, которые находятся на поверхности Вашей модели путем вызова
glDepthFunc
функция сGL_EQUAL
как параметр.