在CALayer上过度使用隐藏是否有相关费用?

时间:2009-09-30 18:52:42

标签: iphone calayer

想知道是否有人可能知道这个问题的答案 - 是否存在与过度隐藏图层相关的成本。

例如,如果一个图层已经被隐藏,那么一遍又一遍地调用layer.hidden = YES比简单地单步执行调用堆栈有更多的开销吗? Cocoa足够聪明,知道该图层已经被隐藏了吗?



- (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;
     }
}

第一个模式允许在条件语句上进行闭包,这会导致更好的编码练习,但会导致额外的堆栈调用,而第二个模式更明确,但会导致条件语句失败。

谢谢, 布赖恩

2 个答案:

答案 0 :(得分:1)

为什么不这样做:

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

这是你的二传手。现在,操作系统甚至可能不会调用drawRect,如果它看到图层被隐藏,并且不需要重新绘制。

答案 1 :(得分:0)

Quartz可能会优化隐藏图层上的设置hidden = YES,但如果你真的想知道你应该进行基准测试。