Frage

Ich habe eine Ansicht, die ein Hintergrundbild und ein CGPath hat, die geändert wird, wenn der Benutzer den Bildschirm berührt. Zeichnen Sie das Bild mit CGContextDrawImage() und dann den Pfad auf Zeichnung ist nicht schnell genug, und es behindert die Berührungsereignis Leistung. Was ich möchte, ist eine Bitmap-Puffer haben, und nur die Änderungen in den Weg zu ihm ziehen. So wird nach Ansicht des drawRect() nur den Puffer zeichnen werden. Ich vermute, ich muss CGContexts verwenden, aber ich kann nicht ganz herausfinden, wie es zu tun. Gibt es eine andere Möglichkeit, dies zu optimieren?

Edit:

ich auf dem Weg bin das Hinzufügen jedes Mal, wenn der Benutzer den Bildschirm berührt; so der „Weg ändert“ bezieht sich auf mehr Punkte auf einen vorhandenen Pfad hinzufügen. Das ist, warum ich glaube, ich kann nur das Bild-Puffer und nur das „Delta“ des Weges statt Zeichnung, die die ganze Sache jedes Mal ziehen. Im Moment meine Zeichnung und Ereignislogik sind so etwas wie folgt aus:

-(void)drawRect{
    //Draw the background image
    //Draw the whole path
}

-(void)touchesMoved{
    //Add the touch point to the path
    [self setNeedsDisplay];
}

den Hintergrund Zeichnung auf diese Weise macht Berührungsereignis Probenahme durchführen deutlich schlechter als nur den Pfad zu ziehen.

War es hilfreich?

Lösung

Wenn das Hintergrundbild nicht verändert (ich kann nicht sicher sagen, ob es ist), dann sollten Sie das Hintergrundbild in einer anderen Coreanimation Schicht gelegt, wobei die Schicht den Weg auf ihn enthält. Das lässt die GPU die Compositing behandeln, anstatt sie alle in Ihrem -drawRect tun. Das Hintergrundbild kann dann, wenn möglich, im Cache gespeichert werden, und das einzige, was werden Sie den Pfad aktualisieren müssen sein wird (die Sie wahrscheinlich immer noch vermeiden vollständig mit jedem Frame neu gezeichnet). Sie können auch Dinge wie Maßstab tun oder den Pfad zu drehen, ohne sich um die Auswirkungen auf das Hintergrundbild zu sorgen.

Andere Tipps

Eigentlich das ist so ziemlich so, wie es schon funktioniert. Der Kontext zu drawRect bestanden zieht in eine CALayer, die gepuffert wird, bis Sie etwas tun, die die Sicht selbst neu zu zeichnen erfordert. Sie haben erwähnt, dass der Pfad geändert wird „wenn der Benutzer den Bildschirm berührt?“ - sind Sie dann einstellen setNeedsDisplay auf der Ansicht

Wenn Sie wirklich einen anderen Weg haben jedes Mal, dann sind Sie nicht in der Lage sein werden, es zu puffern. Wenn es das gleiche, solange Sie nicht setNeedsDisplay nennen, oder etwas, das es genannt bewirken wird wird, dann ist die Schicht, die Ihrer Ansicht Rücken sollte gepuffert werden. Ich habe eine Last von solchen Ansichten in Schichten, die alle mit viel Phantasie CG Material (Zeichnung und Füllwege, Clipping-Bilder, colourising etc etc) und die Leistung ist groß.

Wenn Sie verschiedene Pfade (vielleicht darstellen, visuell, die touch) - Sie könnten über die Verwendung von alternativen Ansichten denken - was mich nicht ändern - oder vielleicht Ansicht Animation auf der einzigen, vorgerenderten Ansicht verwenden?

Wenn keines dieser ins Schwarze trifft, bitte weitere Informationen schreiben Sie uns zu sehen, zu helfen, was Sie versuchen zu tun.

Ich bin nicht 100% positiv, dass es auf diese Weise auf dem iPhone funktioniert, aber auf der äquivalenten X Klasse Mac OS, setNeedsDisplay: effektiv synchron, so teuer Ziehoperationen eine Schleife der Leistung töten. Versuchen Sie, Ihre Zeichencode, die auf einen Timer, der mehrmals pro Sekunde ausführt, anstatt explizit in Ihren Event-Handling-Code aufrufen.

Siehe dieses CocoaBuilder Faden für weitere Informationen .

Von Ihrem bearbeiten sieht es aus wie Sie irgendeine Art von Zeichnung App tun.

In diesem Fall würde ich versuchen, „unbekannt“ 's Vorschlag (Hintergrundbild in separater Ebene / Blick aus dem Weg setzen). In der Tat würde ich das sowieso tun. Sind Sie mit CGPath? Wenn nicht ist es wahrscheinlich lohnt sich das auch.

Wenn Sie noch haben ein Problem, könnte es sich lohnen, die aktuelle „Änderungen“ Aussondern (alle in schneller Folge gezogenen Linien) in ihren eigenen Weg (in ihrer eigenen Schicht / view), und fügen sie sie auf dem Hauptweg nach einer geeigneten Ruhezeit (mit Hilfe eines Timers).

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