3

Я пытаюсь нарисовать тени в прямоугольнике. Сам теневой образ равен 1px * 26px.CALayer vs. drawInRect: производительность?

Вот два метода я думал о для нанесения изображения на вид:

//These methods are called in drawRect: 

/* Method 1 */ 
[self.upperShadow drawInRect:rectHigh]; //upperShadow is UIImage 
[self.lowerShadow drawInRect:rectLow]; 


/* Method 2 */ 
CALayer *shadowTop = [CALayer layer]; 
shadowTop.frame = rectHigh; 
shadowTop.contents = (__bridge id)topShadow; //topShadow is CGImage 
[self.layer addSublayer:shadowTop]; 
CALayer *shadowLow = [CALayer layer]; 
shadowLow.frame = rectLow; 
shadowLow.contents = (__bridge id)lowShadow; 
[self.layer addSublayer:shadowLow]; 

/* Method 3 */  
UIImageView *tShadow = [[UIImageView alloc] initWithFrame:rectHigh]; 
UIImageView *bShadow = [[UIImageView alloc] initWithFrame:rectLow]; 
tShadow.image = self.upperShadow; 
bShadow.image = self.lowerShadow; 
tShadow.contentMode = UIViewContentModeScaleToFill; 
bShadow.contentMode = UIViewContentModeScaleToFill; 
[self addSubview:tShadow]; 
[self addSubview:bShadow]; 

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

drawInRect: took 0.00054 secs 
CALayers took 0.00006 secs 
UIImageView took 0.00017 secs 

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

ответ

2

Если тени являются статическими, то наилучшим способом является использование двух UIImageView s. Это даже умнее, чем CALayer о том, как бороться со статическими изображениями (хотя я не знаю, будет ли это иметь значение здесь), и в противном случае будут иметь те же преимущества, что и CALayer, например, если все композиции выполняются на графическом процессоре (в соответствии с вашим методом 2).

+0

Уверены ли вы? Похоже, что создание 'UIImageView' было бы лишними накладными расходами, как в использовании памяти, так и в использовании ЦП. Я ошибаюсь? И да, тени статичны. Раньше они не были, поскольку я использовал их динамически, создавая путь безье и создавая тень от пути, но это было слишком медленно, поэтому я переключаюсь на статические изображения. –

+0

@ sudorm-rf: Вы ошибаетесь. Представления довольно легкие обертки над слоями, а сами слои на самом деле довольно легкие. Предоставление графическому процессору композиций (которые являются для вас уровнями) * значительно лучше, чем перерисовывать его в коде каждый раз, когда что-либо изменяется. –

+0

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

Смежные вопросы