Question

J'ai un petit problème de vitesse. En charge, je génère un CGMutablePath contenant au moins 1000 points. Je veux faire défiler ce chemin à l'écran, donc j'utilise ce genre de code:

-(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);
}

Le problème, c'est que c'est un peu lent, pas beaucoup, mais comme je dois ajouter beaucoup plus de code graphique ... Je me demandais si l’appareil dessinait l’ensemble du tracé (une fois l’échelle appliquée, le tracé avait une largeur d’environ 10 000 pixels), ou uniquement la partie visible à l’écran? Que puis-je faire pour optimiser cela?

Était-ce utile?

La solution 2

Après avoir essayé pas mal de choses (comme diviser mon énorme chemin de 1000 points en plus petits chemins de 10 points, etc.), j'ai tout porté en openGL, en utilisant de simples tableaux de sommets. Il m'a fallu environ 4 heures pour tout porter (même redimensionner le chemin, le faire défiler, etc.) et maintenant, je reçois une animation complète à 60 ips, alors que je n'avais qu'une moyenne de 22 ips avec des pics à 28 lors de l'utilisation du CoreGraphics.

Autres conseils

Dessiner un chemin d'accès de 1 000 points ou de 10 000 points 60 fois par seconde va réellement ralentir votre application, si cela est possible. Si le chemin est statique, vous ne devriez vraiment le dessiner qu'une seule fois dans votre UIView, de manière à ce qu'il soit mis en cache dans le calque de UIView et à l'animer. Si vous souhaitez l'animer, vous pouvez regarder le nouveau CAShapeLayer, qui offre la possibilité d'animer un chemin de Bézier en appliquant simplement une animation à sa propriété path.

Cependant, 10 000 pixels étant plus larges que la taille de texture maximale de l'iPhone (2048 x 2048), vous aurez des problèmes pour l'afficher dans une vue ou un calque standard et vous devrez peut-être le diviser en fragments plus petits ou utilisez un CATiledLayer pour le rendre à l'écran.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top