Warum ist dieser CATiledLayer / PDF-Code langsam?

8

Hier ist der Code:

Ссылка

Ich nahm den WWDC 2010 PhotoScroller -Beispielcode, der den verschachtelten UIScrollViews für das Zoomen implementiert, innerhalb eines UIScrollView für den Seitenwechsel und tauschte, wie ich dachte, minimalen Code für die Anzeige einer mehrseitigen PDF aus anstelle von Bildern.

Es funktioniert. Aber es ist langsam auf meinem iPhone4, ungefähr drei Sekunden, um die erste Seite zu malen, und noch langsamer auf meinem iPod Touch. Ich kann mir die einzelnen Fliesen ansehen. Das selbe PDF öffnet sich bereits schneller, ohne sichtbare Kachelzeichnung, in einer alternativen CATiledLayer Implementierung, die einfach ein einzelnes CATiledLayer / UIScrollView verwendet und Ereignisse berührt, um Seiten zu ändern. Ich möchte diese PhotoScroller -Technik verwenden, es ist sehr nett.

Ich habe es mit CPU Sampler in Instruments angeschaut, und es scheint nicht der PDF-Rendering-Code zu sein, es sieht so aus, als ob die Zeit in Threading und Messaging verbraucht wird. Ich würde es schätzen, wenn jemand helfen könnte, aufzuzeigen, was dieses Beispiel tut, um den Overhead zu verursachen.

Danke,

Jim

Update 1: Ich hatte ursprünglich die TilingView -Klasse-Technik aus dem Beispielcode von defining

verwendet %Vor%

Und dann in - (void)drawRect:(CGRect)rect eingezeichnet, aber als erster Versuch in die explizite CATiledLayer -Unterklasse zu wechseln, um zu sehen, ob es einen Unterschied machen würde, aber das tat es nicht, und so ließ ich den Code unverändert. Es gibt auch ein fehlendes [tiledLayer release]; -Leck in TilingView.

    
jbm 09.08.2010, 16:50
quelle

3 Antworten

4

Siehe diesen Thread Schnelle und schlanke PDF-Viewer für iPhone / iPad / iOs - Tipps und Tricks? für PDF-Rendering-Tipps.

    
Luke Mcneice 27.10.2010, 20:19
quelle
2

Da Ihr Code einige Fehler enthält und ich den Code nicht kompilieren kann, habe ich mir die PDF-Datei angesehen, die im Archiv enthalten war, und ich weiß, warum Ihr TilingView langsam ist.

Normalerweise, wenn Sie eine PDF-Seite in CGContext mit der Methode CGContextDrawPDFPage : zeichnen, wurden alle Text- und Vektorgrafiken gerendert und andere Dinge wie normale Grafiken im PDF werden einfach gezeichnet und zwischengespeichert. Es spielt also keine Rolle, wie groß die PDF-Datei ist, aber es spielt eine Rolle, ob Sie vektorielle Grafiken in Ihrer PDF-Datei haben. Es scheint, dass Sie in Ihrem PDF eine vektorielle Grafik und einige mathematische Gleichungen haben, deshalb ist es langsam. Ich empfehle Ihnen, mit einer anderen PDF-Datei zu versuchen, die keine Vektorgrafiken enthält, und zu sehen, ob sie schneller ist.

Prost

Zheng

    
user422586 17.08.2010 08:21
quelle
1

Vermuten Sie nicht mit irgendeiner Art von Autorität: PDF ist ein vektorbasiertes Format für die meisten Dokumente (ausgenommen solche, die einfach als Container für eingebettete TIFF-Bilder dienen). Wenn Sie die PDF-Datei wie den PhotoScroller kacheln, bitten Sie das Telefon im Wesentlichen darum, die gesamte PDF-Datei (zumindest die angegebene Seite) für jede einzelne Kachel zu skalieren und zu rastern. Anstatt es für einen einzelnen CATiledLayer einmal zu malen, machst du es mehrmals für jede Auflösung. Da das PDF-Dokument selbst ein skalierbares Format ist, sollten Sie in der Lage sein, die gesamte Ansicht für jede Seite / Skala einfach einmal zu rendern.

Update: Nachdem ich dies selbst durchgegangen bin, hat das PhotoScroller-Beispiel einige logische Probleme, die es sehr langsam machen. Im Grunde wird jede Kachel auf 1 / zoomScale gerendert und die Skalierung wird wieder auf zoomScale zurückgesetzt. Wenn der Zoom also bei .5 ist, wird er bei 2x gerendert und dann auf 0.5x zurück skaliert. Sehr langsam und ineffizient.

    
Paul Alexander 17.09.2010 16:15
quelle