Warum dekomprimiert dieser Code ein UIImage so viel besser als der naive Ansatz?

8

In meiner App muss ich große JPEG-Bilder laden und sie in einer Bildlaufansicht anzeigen. Um die Benutzeroberfläche ansprechbar zu halten, entschied ich mich, die Bilder im Hintergrund zu laden und sie dann im Hauptthread anzuzeigen. Um sie vollständig in den Hintergrund zu laden, zwinge ich jedes Bild dazu, dekomprimiert zu werden. Ich war mit diesem Code ein Bild zu dekomprimieren (beachte, dass meine App nur iOS 7 ist, also verstehe ich, dass die Verwendung dieser Methoden in einem Hintergrundthread OK ist):

%Vor%

Allerdings hatte ich immer noch lange Ladezeiten, UI-Stottern und viel Speicherdruck. Ich habe gerade eine andere Lösung gefunden:

%Vor%

Dieser Code ist um Größenordnungen besser. Das Bild wird fast sofort geladen, es gibt kein UI-Stottern und die Speicherauslastung ist stark zurückgegangen.

Also meine Frage ist zweifach:

  1. Warum ist die zweite Methode so viel besser als die erste?
  2. Wenn die zweite Methode aufgrund der einzigartigen Parameter des Geräts besser ist, gibt es eine Möglichkeit, sicherzustellen, dass sie für alle iOS-Geräte, ob aktuell oder zukünftig, gleich gut funktioniert? Ich möchte nicht ein natives Bitmap-Format annehmen, das sich auf mich ändert und dieses Problem wieder einführt.
Hilton Campbell 30.10.2013, 12:54
quelle

1 Antwort

6

Ich gehe davon aus, dass Sie dies auf einem Retina-Gerät ausführen. In UIGraphicsBeginImageContextWithOptions haben Sie nach der Standardskalierung gefragt, also der Skalierung des Hauptbildschirms (2). Dies bedeutet, dass die Bitmap 4x größer wird. In der zweiten Funktion zeichnen Sie mit einem Maßstab von 1:

Übergeben Sie eine Skala von 1 bis UIGraphicsBeginImageContextWithOptions und sehen Sie, ob Ihre Leistung ähnlich ist.

    
Rob Napier 30.10.2013, 13:24
quelle