Zeichnen Sie CGPath effizient auf CATiledLayer

8

Wie würde ich effizient CGPath auf CATiledLayer zeichnen? Ich überprüfe gerade, ob die Begrenzungsbox der Kachel die Begrenzungsbox des Pfades wie folgt schneidet:

%Vor%

Dies ist nicht sehr effizient, da das drawLayer:inContext: mehrmals von mehreren Threads aufgerufen wird und dazu führt, dass der Pfad mehrmals gezeichnet wird.

Gibt es einen besseren, effizienteren Weg, dies zu tun?

    
JWood 03.02.2012, 12:55
quelle

2 Antworten

5

Die einfachste Möglichkeit besteht darin, Ihre Kurve in ein großes Bild zu zeichnen und dann das Bild zu kacheln. Aber wenn Sie kacheln, bedeutet das wahrscheinlich, dass das Bild zu groß wäre, oder Sie hätten den Pfad zuerst gezeichnet, richtig?

Sie müssen wahrscheinlich Ihren Weg aufteilen. Der einfachste Ansatz besteht darin, Element für Element mit CGPathApply aufzuteilen. Für jedes Element können Sie sein Begrenzungsfeld prüfen und bestimmen, ob dieses Element in Ihre Grenzen fällt. Wenn nicht, behalten Sie den letzten Endpunkt im Auge. Wenn dies der Fall ist, bewegen Sie sich zum letzten Endpunkt, den Sie gesehen haben, und fügen Sie das Element zu einem neuen Pfad für diese Kachel hinzu. Wenn Sie fertig sind, zeichnet jede Kachel ihren eigenen Pfad.

Technisch werden Sie Dinge zeichnen, die außerhalb Ihrer Grenzen liegen (wie etwa eine Linie, die über die Kachel hinausreicht), aber das ist viel billiger als es klingt. Core Graphics wird einzelne Elemente sehr einfach abschneiden. Ziel ist es, die Berechnung von Elementen, die sich nicht in Ihrer Bounding Box befinden, zu vermeiden.

Achten Sie darauf, den resultierenden Pfad zwischenzuspeichern. Sie müssen den Pfad für jede Kachel nicht berechnen. nur die, die du zeichnest. Aber vermeide es jedes Mal neu zu berechnen, wenn das Plättchen gezogen wird. Wenn sich die Daten ändern, löschen Sie Ihren Cache. Wenn es sehr viele Kacheln gibt, können Sie auch NSCache verwenden, um dies noch besser zu optimieren.

    
Rob Napier 15.02.2012, 14:01
quelle
2

Sie zeigen nicht an, wo der Pfad erstellt wird. Wenn möglich, können Sie versuchen, den Pfad in der Methode -drawLayer:inContext: zu erstellen, indem Sie nur den Teil erstellen, der für die zu zeichnende Kachel benötigt wird.

Wie bei allen Leistungsproblemen sollten Sie Instrumente verwenden, um Ihren Code zu profilieren und genau herauszufinden, wo die Engpässe liegen. Hast du das schon versucht, und wenn ja, was hast du gefunden?

Als Nebenbemerkung, gibt es einen Grund, warum Sie CGPath anstelle von UIBezierPath verwenden? Von Apples Dokumentation :

  

Zum Erstellen von Pfaden in iOS wird empfohlen, dass Sie UIBezierPath verwenden   anstelle von CGPath-Funktionen, es sei denn, Sie benötigen einige der Funktionen   Dies bietet nur Core Graphics, beispielsweise das Hinzufügen von Ellipsen zu Pfaden.   Weitere Informationen zum Erstellen und Rendern von Pfaden in UIKit finden Sie unter "Formen zeichnen"   Verwenden von Bezier-Pfaden. "

    
Andrew Madsen 13.02.2012 21:10
quelle