Есть ли стоимость, связанная с использованием скрытого CALayer? - PullRequest
0 голосов
/ 30 сентября 2009

Интересно, может ли кто-нибудь знать ответ на этот вопрос - есть ли затраты, связанные с сокрытием слоя.

Например, если слой уже скрыт, вызывает ли вызов layer.hidden = YES снова и снова какие-либо дополнительные издержки, чем простое прохождение по стеку вызовов? Какао достаточно умен, чтобы знать, что слой уже спрятан?



- (void) drawRect:(CGRect)rect
{
     if ( characterLeftFlag ) {
          characterLeftView.layer.hidden = NO;
          characterRightView.layer.hidden = YES;
     }
     else {
          characterLeftView.layer.hidden = YES;
          characterRightView.layer.hidden = NO;
     }
}

Или мне всегда нужно проверять, изменилась ли видимость слоев, а затем вызывать скрытый?



- (void) drawRect:(CGRect)rect
{
     if ( characterLeftFlag && characterLeftView.layer.hidden ) {
          characterLeftView.layer.hidden = NO;
          characterRightView.layer.hidden = YES;
     }
     else if ( characterRightFlag && characterRightView.layer.hidden ) {
          characterLeftView.layer.hidden = YES;
          characterRightView.layer.hidden = NO;
     }
}

Первый шаблон допускает замыкание в условном операторе, что приводит к лучшей практике кодирования, но приводит к дополнительным вызовам стека, в то время как второй шаблон является более явным, но приводит к условному оператору, который проваливается.

Спасибо, Bryan

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Почему бы не сделать это:

- (void)setCharacterLeftFlag:flag {
    if ( flag ) {
          characterLeftView.layer.hidden = NO;
          characterRightView.layer.hidden = YES;
     }
     else {
          characterLeftView.layer.hidden = YES;
          characterRightView.layer.hidden = NO;
     }
}

это ваш сеттер. Теперь ОС может даже не вызывать drawRect, если видит, что слой скрыт, и его не нужно перерисовывать.

0 голосов
/ 30 сентября 2009

Кварц, вероятно, оптимизирует настройку hidden = YES на скрытом слое, но если вы действительно хотите это выяснить, вам следует провести эталонный тест.

...