Domanda

Sto lavorando su un'applicazione a schermo intero di cacao. Sto usando 1 NSView che ha 1 CALayer che dispone di più sottolivelli. In questo momento per la prova - sto usando qualsiasi combinazioni di tasti per aggiungere punti (20 x 20) allo schermo. Questo è solo per testare di disegnare i punti. Il mio problema è che io sto usando un filtro sui miei livelli di punti - specificamente Sto usando CIDiscBlur - e una volta raggiungo circa 30 punti - il disegno dei punti rallenta sensibilmente. Non ci può essere un 1-1,5 secondi di ritardo tra la pressione di un tasto e l'aspetto del punto. Ho notato che se rimuovere l'impostazione del filtro CIDisBlur sugli strati -. Che non v'è alcun rallentamento

Ci sono delle migliori pratiche o suggerimenti che dovrebbe utilizzare al momento di elaborare questo molti sottolivelli? Qualsiasi aiuto sarebbe grande.

    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];

Ho anche provato ad utilizzare masksToBounds = YES per vedere se questo ha aiutato -. Ma senza fortuna

È stato utile?

Soluzione

È possibile probabilmente ottenere un miglioramento delle prestazioni non usando raggio d'angolo per rendere i livelli rotonde. Mentre è un bel po 'di scelta rapida per solo fare uno strato di turno in un contesto statico, quando si sta animando, si degraderà significativamente le prestazioni. Si sarebbe meglio specificare un percorso circolare per un CAShapeLayer o far cadere verso il basso per core grafico e solo disegnare un cerchio nella chiamata drawInContext. Per verificare se ho ragione, basta commento fuori la chiamata per impostare il raggio angolo e applicare il filtro. Vedere se che accelera le cose. Se no, allora io non sono sicuro di quello che succede. Può significare che dovrete trovare un modo diverso per ottenere l'effetto senza filtro. Se avrete sempre lo stesso aspetto per i vostri punti, si può probabilmente "barare" utilizzando un'immagine.

Con i migliori saluti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top