2011-01-21 18 views
0

私はCocoaフルスクリーンアプリケーションを開発中です。私は1 NSViewを使用していますが、1 CALayerには複数のサブレイヤがあります。テストのために今私は画面にドット(20×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呼び出しで円を描く方がよいでしょう。私が正しいかどうかをテストするには、角の半径を設定してフィルタを適用するというあなたの呼び出しをコメントしてください。それが物事をスピードアップするかどうか見てください。そうでなければ、何が起きているのか分かりません。フィルタなしで効果を得るためには別の方法を見つけなければならないかもしれません。いつもあなたのドットが同じように見える場合は、画像を使用して "チート"することができます。

よろしくお願いいたします。

関連する問題