Domanda

Ho un piccolo problema di velocità di marcia. Al caricamento, generi un CGMutablePath contenente almeno 1000 punti. Voglio scorrere questo percorso sullo schermo, quindi uso questo tipo di codice:

-(void) drawRect:(CGRect)rect {

    /*
    Here, I have a timer calling drawRect 60 times per second.
    There's also code for the scale and currentTime, based on
    an MP3 playback (AVAudioPlayer);
    */

    CGContextRef ref = UIGraphicsGetCurrentContext();   
    CGContextClearRect(ref, [self frame]);

    CGContextSaveGState(ref);
    CGContextTranslateCTM(ref, s.width/2+currentTime, 1);
    CGContextScaleCTM(ref, scale, 1);
    CGContextAddPath(ref, myGraphPath);
    CGContextSetRGBFillColor(ref, .1, .1, .1, .8);
    CGContextFillPath(ref);
    CGContextRestoreGState(ref);
}

Il problema è che è un po 'lento, non molto, ma dato che devo aggiungere molto più codice grafico ... Mi chiedevo se il dispositivo sta disegnando l'intero percorso (una volta applicata la scala, il percorso è largo circa 10.000 pixel) o solo la parte visibile sullo schermo? Cosa posso fare per ottimizzarlo?

È stato utile?

Soluzione 2

Dopo aver provato molte cose (come dividere il mio enorme percorso di 1000 punti in percorsi di 10 punti più piccoli ecc ...), ho portato tutto su OpenGL, usando semplici array di vertici. Mi ci sono volute circa 4 ore per eseguire il porting di tutto (anche ridimensionando il percorso, scorrendolo, ecc ...) e ora ricevo sempre un'animazione completa a 60 fps, quando avevo solo una media di 22 fps con picchi a 28 quando usavo il CoreGraphics.

Altri suggerimenti

Tracciare un percorso di 1.000 punti o 10.000 punti 60 volte al secondo rallenterà davvero l'applicazione, se possibile. Se il percorso è statico, dovresti davvero guardarlo disegnandolo una sola volta all'interno di UIView, in modo che sia memorizzato nella cache all'interno del livello di UIView e animando il livello attorno. Deve essere animato, puoi guardare il nuovo CAShapeLayer, che offre la possibilità di animare un percorso di Bezier semplicemente applicando un'animazione alla sua proprietà path.

Tuttavia, 10.000 pixel saranno più larghi della dimensione massima della trama sull'iPhone (2048 x 2048), quindi avrai problemi a visualizzarlo in qualsiasi vista o livello standard e potrebbe essere necessario suddividerlo in blocchi più piccoli o usa un CATiledLayer per renderlo sullo schermo.

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