Пустой UIView с минимальным drawRect: накладные расходы - PullRequest
1 голос
/ 27 мая 2009

У меня есть приложение, которое имеет три вложенных представления, которые являются механически важными, но не имеют визуальных элементов:

  • Ванильный UIView, который не имеет собственного содержимого и просто используется в качестве хоста для CALayers.
  • UIScrollView (который запрашивается для его происхождения и используется для позиционирования CALayers в 3d: я действительно использую это представление только для точной репликации "механики" представления прокрутки),
  • Содержание представления прокрутки: подкласс UIView. Он просто регистрирует сенсорные события и передает их делегату - все, что важно, это его механизм UIResponder.

UIView, размещающий CALayers, является родственным UIImageView, который является фоновым изображением, на котором рисуются CALayers.

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

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

Итак, короче говоря, я не очень хорошо представляю, что происходит и что не привлекается (кто-нибудь знает такой инструмент, как Quartz Debug для iPhone / симулятора?), Или как не мешать рисованию. .

Совет будет очень кстати! Спасибо, Бенжон

Ответы [ 2 ]

1 голос
/ 27 мая 2009

Помимо UIScrollView, о котором я не могу говорить, ваши другие представления не должны сильно мешать рисованию, если вы вручную не вызываете setNeedsDisplay или не установите для свойства своего слоя needsDisplayOnBoundsChange значение YES. Представления рисуют один раз и кешируют свои слои на GPU в то время. Перерисовка стоит дорого, но это происходит только в том случае, если вы запускаете ее вручную с помощью средств, описанных выше. Эти виды и слои будут использовать память, поэтому это вызывает беспокойство, особенно если вмещающие виды становятся очень большими (особенно близко к предельному размеру текстуры 2048 x 2048). К сожалению, вы ничего не можете с этим поделать.

В качестве рекомендации, если все, что вы делаете, это вращение и масштабирование слоев в 3-D, я мог бы предложить вам взглянуть на некоторый пример кода , который я написал для выполнения 3-D вращение и масштабирование на iPhone с помощью Core Animation. Он основан на коде , написанном Биллом Дадни, в котором события касания преобразуются в движения одним касанием и жесты двумя пальцами, а затем используются для управления слоями в 3-D. Это может упростить ваш код, устраняя необходимость в UIScrollView и настраиваемом представлении содержимого.

0 голосов
/ 14 декабря 2009

На самом деле вы можете использовать инструменты с инструментом Core Animation, чтобы увидеть, что рисуется (обязательно отключите мигание, прежде чем выйти, потому что это глобальная настройка на вашем устройстве).

...