UIImageView zeigt VIEL schneller als entweder CG oder CALayer. Wer weiß warum?

8

Ich habe eine App geschrieben, um die Bildleistung auf iOS zu testen. Ich habe 3 verschiedene Ansichten ausprobiert, die alle das gleiche große PNG anzeigen. Die erste ist eine Ansicht, die mit CGContextDrawImage () zeichnet. Die zweite setzt self.layer.content. Die dritte ist eine einfache UIImageView.

Das verwendete Bild wird mit - [UIImage initWithContentsOfData:] erstellt und im ViewController zwischengespeichert. Jeder Test weist wiederholt eine Ansicht zu, fügt sie der Ansichtshierarchie hinzu und entfernt sie dann und gibt sie frei. Timings werden vom Start von loadView zu viewDidAppear genommen und als fps angegeben (effektiv, Aufrufe pro Sekunde).

Hier sind die Ergebnisse von einem iPad 1 mit 5.1 mit einem unskalierten 912 x 634 Bild:

%Vor%

Halluziniere ich? Es scheint fast unmöglich, dass UIImageView so schnell zeichnen kann, aber ich kann die Bilder tatsächlich flimmern sehen. Ich habe versucht, zwischen zwei ähnlichen Ansichten zu wechseln, um eine mögliche Zwischenspeicherung zu verhindern, aber die Bildrate war noch höher.

Ich hatte immer angenommen, dass UIImageView nur ein Wrapper für - [CALayer setContent] war. Das Profilieren der UIImageView zeigt jedoch fast keine Zeit, die in irgendeiner Zeichnungsmethode verbracht wird, die ich identifizieren kann.

Ich würde gerne verstehen, was vor sich geht. Jede Hilfe wäre sehr geschätzt.

    
John Graziano 19.04.2012, 00:21
quelle

3 Antworten

1

Hier ist meine Idee.

Wenn Sie eine UIView-Hierarchie ändern, indem Sie eine Ansicht hinzufügen, entfernen oder ändern, wird noch keine Zeichnung erstellt. Stattdessen ist die Ansicht mit 'setNeedsDisplay' markiert und wird neu gezeichnet, wenn der Runloop das nächste Mal frei zeichnen kann.

Wenn Ihr Testcode in etwa so aussieht (kann ich nur raten):

%Vor%

als der Runloop blockiert ist, bis diese for-Schleife beendet ist. Die Ansichtshierarchie wird nur einmal gezeichnet, die gemessene Leistung ist die des Zuordnens und Initialisierens von Objekten.

Auf der anderen Seite kann CGContextDrawImage () sofort zeichnen, denke ich.

    
lukasz 19.04.2012 06:06
quelle
1

Der hohe FpS mit UIImageView ist, weil dies nicht wirklich neu zeichnet, sondern nur den Inhalt für das Neuzeichnen markiert, manchmal in der Zukunft, wenn UIKit das Gefühl hat, es zu tun.

Als Anmerkung: Allerdings ist das CGContext-Verfahren schneller als das CALayer-Verfahren. Ich habe diese Methoden auch in einem meiner Projekte ausprobiert und die Arbeit mit CALayer ist die schnellste Methode (außer OpenGL ES natürlich).

    
Florian 12.11.2012 13:01
quelle
0

UIImageView verwendet eine andere Möglichkeit zum Rendern von Bildern, die viel effizienter ist. Sie sollten sich dieses Session-Video von WWDC 2011 ansehen, das erklärt, wie der Rendering-Prozess funktioniert: Ссылка

    
icant 04.05.2012 13:57
quelle