2011-01-21 1 views
0

나는 코코아 전체 화면 응용 프로그램을 작업 중입니다. 1 NSView을 사용 중이고 1 CALayer에 여러 개의 하위 레이어가 있습니다. 지금 테스트를 위해 - 나는 어떤 키 입력을 사용하여 도트 (20 x 20)를 화면에 추가합니다. 이것은 점을 그리기위한 테스트 용입니다. 제 문제는 필자의 도트 레이어에 필터를 사용하고 있다는 것입니다. 구체적으로는 CIDiscBlur을 사용하고 약 30 도트에 도달하면 점의 드로잉이 상당히 느려집니다. 키 누름과 점 모양 사이에는 1 - 1.5 초 지연이있을 수 있습니다. 나는 레이어에서 CIDisBlur 필터를 제거하면 느려지지 않는다는 것을 알았다.CALayer 필터의 성능 향상

이 많은 하위 레이어를 그릴 때 사용해야하는 모범 사례가 있습니까? 어떤 도움이라도 좋을 것입니다.

CIFilter *blurFilter = [CIFilter filterWithName:@"CIDiscBlur"]; 
    [blurFilter setDefaults]; 
    [blurFilter setValue:(id)[NSNumber numberWithFloat:15.0] forKey:@"inputRadius"]; 

    dotFilters = [[NSArray arrayWithObjects:(id)blurFilter, nil] retain]; 

    CGColorRef purpleColor = CGColorCreateGenericRGB(0.604, 0.247, 0.463, 1.0); 

    CALayer *dot = [[CALayer layer] retain]; 
    dot.backgroundColor = purpleColor; 
    dot.cornerRadius = 15.0f; 
    dot.filters = dotFilters; 

    NSRect screenRect = [[self.window screen] frame]; 

    // 10 point border around the screen 

    CGFloat width = screenRect.size.width - 20; 
    CGFloat height = screenRect.size.height - 20; 

    #define ARC4RANDOM_MAX  0x100000000 
    width = ((CGFloat)arc4random()/ARC4RANDOM_MAX) * width + 10; 
    height = ((CGFloat)arc4random()/ARC4RANDOM_MAX) * height + 10; 

    dot.frame = CGRectMake(width, height, 20,20);//30, 30); 


    [dot addSublayer:dotsLayer]; 

나는 또한 도움이 있는지 확인하기 위해 masksToBounds = YES를 사용하여 시도하지 -하지만 운.

답변

1

라운드 반경을 만들기 위해 코너 반경을 사용하지 않아도 성능이 향상 될 수 있습니다. 정적 컨텍스트에서 둥근 레이어를 만드는 것이 가장 좋은 방법이지만 애니메이션을 적용하면 성능이 크게 떨어집니다. CAShapeLayer에 대한 순환 경로를 지정하거나 Core Graphics로 떨어 뜨리고 drawInContext 호출에서 원을 그리는 것이 좋습니다. 내가 옳은지 테스트하려면 모퉁이 반경을 설정하고 필터를 적용하라는 전화를 메모 해주세요. 그것이 속도를 높이는 지보십시오. 그렇지 않다면 나는 무엇이 일어나고 있는지 확신 할 수 없다. 필터없이 효과를 얻으려면 다른 방법을 찾아야합니다. 언제나 똑같은 점을 원한다면, 이미지를 사용하여 "속일 수"있습니다.

감사합니다.