2011-01-21 59 views
0

我正在開發一個Cocoa全屏應用程序。我正在使用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調用中畫一個圓。爲了測試我是否正確,只需將您的電話註釋掉即可設置角落半徑並應用您的過濾器。看看這是否會加快速度。如果不是,那麼我不確定發生了什麼。這可能意味着你必須找到一種不用過濾器才能獲得效果的方法。如果你總是對你的點有相同的外觀,你可能可以通過使用圖像「作弊」。

此致敬禮。