iOS - медленная анимация на iPhone 4S (но хорошо на симуляторе) - PullRequest
3 голосов
/ 07 февраля 2012

Я подклассифицировал UILabel с помощью следующего кода, который работает нормально, но любая анимация, включающая подкласс, выполняется намного медленнее, чем обычные UILabel. Я предполагаю, что Кварц - виновник, но могу ли я что-нибудь сделать, чтобы немного ускорить процесс?

- (void)drawTextInRect:(CGRect)rect
{
    CGSize shadowOffset = self.shadowOffset;
    UIColor *textColor = self.textColor;

    // Establish the Quartz 2D drawing destination:
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 1);
    CGContextSetLineJoin(context, kCGLineJoinRound);

    // Draw the label’s outline:
    CGContextSetTextDrawingMode(context, kCGTextStroke);
    self.textColor = [UIColor whiteColor];
    [super drawTextInRect:rect];

    // Draw the label:
    CGContextSetTextDrawingMode(context, kCGTextFill);
    self.textColor = [UIColor textColor];
    self.shadowOffset = CGSizeMake(0, 0);
    [super drawTextInRect:rect];

    self.shadowOffset = shadowOffset;
}

Ответы [ 2 ]

5 голосов
/ 07 февраля 2012

То, что сказал @MobileOverlord, безусловно, применимо, особенно части о профилировании.

Отмечу, что установка shouldRasterize = YES не является универсальным решением (почему бы Apple не установил его по умолчанию, если бы это было так?). Да, это может улучшить производительность прокрутки, но это может быть сделано за счет использования памяти, поскольку в результате вы можете получить кучу больших изображений, хранящихся в кеше.

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

Дополнительным фактором, который следует учитывать, является наличие прозрачности в вашем представлении. Если вы можете гарантировать платформам, что ваше представление непрозрачно (см. SetOpaque / isOpaque), они могут оптимизировать рендеринг, не учитывая все сложности, связанные с альфа-каналами и т. Д. Аналогичные соображения применимы к CALayer.

Наконец, за пределами блока кода, который вы показали, вы делали что-нибудь незаметное для заднего слоя (например, устанавливали радиус тени или угла)? Это быстрый способ убить производительность на анимации тоже.

3 голосов
/ 07 февраля 2012

После того, как вы закончите рисовать ваш ярлык, вы можете вызвать shouldRasterize на его слое, и это должно ускорить вашу анимацию.

shouldRasterize Логическое значение, указывающее, отображается ли слой как растровое изображение перед компоновкой.Animatable

@ property BOOL shouldRasterize Обсуждение Когда значением этого свойства является YES, слой визуализируется как растровое изображение в его локальном координатном пространстве, а затем комбинируется с пунктом назначения с любым другим содержимым.Эффекты тени и любые фильтры в свойстве filters растеризуются и включаются в растровое изображение.Однако текущая непрозрачность слоя не растеризована.Если растровое растровое изображение требует масштабирования во время компоновки, фильтры в свойствах minificationFilter и magnificationFilter применяются по мере необходимости.

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

Значение по умолчанию для этого свойства - NO.

Из CALayer Class Reference

Симулятор всегда даст вам лучшие результаты, чем устройство, потому что он способен использовать всю вычислительную мощность и память вашей системы.Таким образом, вы получите ошибочные результаты.Всякий раз, когда вы делаете рисование CoreGraphics в сочетании с CoreAnimation, важно протестировать результаты на реальном устройстве.

Для этого вы можете попробовать запустить свое приложение в Инструменте Core Animation Tool, чтобы попытаться найти виновных.Ознакомьтесь с моим руководством.

Инструменты - Оптимизация базовой анимации

...