Лучшая производительность при использовании изображений с «непрозрачным» свойством? Зачем? - PullRequest
6 голосов
/ 27 марта 2011

Я только что нашел что-то на этом сайте: iphoneexamples.com . Смотря "Показать изображения", я нашел что-то новое для меня.

myImage.opaque = YES; // явно непрозрачный для производительности

Может кто-нибудь объяснить мне, пожалуйста? И для какого вида (или использования) изображений это работает? Когда нет? Было бы здорово узнать. Спасибо за ваше время ...

Ответы [ 4 ]

13 голосов
/ 27 марта 2011

iPhone GPU - это рендерер на основе плиток.Если наложенный слой полностью непрозрачен для всей плитки, графический процессор может игнорировать настройку и обработку любых графических команд, связанных с нижележащим слоем для этой конкретной плитки, в дополнение к тому, что нет необходимости выполнять компоновку пикселей в этой плитке.*

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

9 голосов
/ 28 марта 2011

Из Просмотр руководства по программированию для iOS :

Объявлять виды как непрозрачные всякий раз, когда Возможные

UIKit использует непрозрачный свойство каждого вида для определения может ли вид оптимизировать операции композитинга. Настройка Значение этого свойства в ДА для пользовательский вид говорит UIKit, что он делает не нужно рендерить какой-либо контент ваш взгляд. Меньше рендеринга может привести к повышенная производительность для вашего рисунка код и вообще поощряется. из Конечно, если вы установите непрозрачное свойство Да, ваш взгляд должен заполнить его ограничивает прямоугольник полностью с полностью непрозрачный контент.

hotpaw2 указывает на скрытую причину этого, которую можно найти в Руководстве по программированию OpenGL ES для iOS :

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

3 голосов
/ 27 марта 2011

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

2 голосов
/ 07 июня 2011

Небольшая хитрость, о которой нужно знать, заключается в том, что UIImageView будет сбрасывать непрозрачное свойство в FALSE каждый раз, когда свойство изображения изменяется на новый UIImage.Вы можете явно проверить ваш код и установить непрозрачное свойство после любого изменения свойства изображения, или вы можете расширить UIImageView и предоставить собственную реализацию setImage, которая устанавливает непрозрачный после вызова метода super setImage.Я узнал об этом только случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...