Frage

Ich habe eine kleine Laufgeschwindigkeit Problem. Auf Last erzeugen eine I CGMutablePath mindestens 1000 Punkte enthält. Ich mag diesen Weg auf dem Bildschirm bewegen, so dass ich diese Art von 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);
}

Das Problem ist, dass es ein bisschen langsam ist, nicht sehr viel, aber als ich brauche eine ganze Menge mehr von grafischem Code hinzufügen ... Ich habe mich gefragt, ob das Gerät den ganzen Weg Zeichnung (sobald der Maßstab angelegt wird, ist der Weg über 10.000 Pixel breit) oder nur der Teil auf dem Bildschirm sichtbar? Was kann ich tun, dies zu optimieren?

War es hilfreich?

Lösung 2

Nachdem eine Menge Dinge zu versuchen (wie Dividieren meine riesigen 1000 Punkte Weg in kleinere 10 Punkte Pfade etc ...), habe ich portiert alles openGL, mit einfachen Vertex Arrays. Es dauerte etwa 4 Stunden bis Port alles (auch den Pfad der Skalierung es Scrollen, etc ...) und jetzt bekomme ich eine volle 60fps Animation die ganze Zeit, wenn ich nur 22fps mit Peaks bei 28 Durchschnitt aufweist, wurde bei der Verwendung von Core Graphics.

Andere Tipps

Zeichnung, die eine 1.000-Punkte oder 10.000-Punkt-Weg 60 mal pro Sekunde wird sich verlangsamen Ihre Anwendung wirklich nach unten, wenn es überhaupt möglich ist. Wenn der Pfad statisch ist, sollte man sich wirklich nur schaut sie einmal in Ihrem UIView zeichnen, so dass sie innerhalb der UIView der Ebene zwischengespeichert wird, und die Schicht um Animieren. Es braucht sie animiert werden, erhalten Sie bei neuen CAShapeLayer aussehen könnte, die die Fähigkeit einfach einen Bézier-Pfad zu animieren bietet durch eine Animation auf seinem Weg Eigenschaft anwenden.

Allerdings werden 10.000 Pixel breiter sein als die maximale Texturgröße auf dem iPhone (2048 x 2048), so dass Sie Probleme mit der Anzeige, dass in jeder Standard-Ansicht oder Schicht und kann entweder müssen sie in kleinere Stücke zerbrechen haben werden oder verwenden, um ein CATiledLayer es auf den Bildschirm zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top