CALayer против drawInRect: производительность? - PullRequest
3 голосов
/ 07 января 2012

Я пытаюсь нарисовать тени в прямоугольнике. Само теневое изображение составляет около 1px * 26px.

Вот два способа рисования изображения в представлении, о которых я подумал:

//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

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

1 Ответ

2 голосов
/ 07 января 2012

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

...