2012-09-21 11 views
5

Ich habe kürzlich Probleme mit der Speicherverwaltung in meiner App festgestellt.Extrem hohe Speicherbelegung - Umgang mit großen Bildern auf dem iPad?

Die Anwendung profitiert von einigen qualitativ hochwertigen Bildern und dies erhöht die Speicherauslastung extrem.

Hier sind einige Informationen über das Projekt und Bilder Details der Ausgabe deutlicher zu machen:

  • Es gibt rund 90 Bilder zu meinem Projekt hinzugefügt. Die Hälfte von ihnen sind in @ 2x Größe entworfen, um das neue iPad Retina Display zu unterstützen. So ist die maximale Anzahl der Bilder für jedes Gerät um 45.

  • Gesamtgröße der Retina-Version aller Bilder ist etwa 25 Megabyte (Größe jedes einzelnen Bildes ist variabel von 10 KB bis 6,8 MB). Inzwischen entspricht die Größe aller Standardbilder 11 Megabyte.

  • Die Größe des XCode-Archivs des Projekts entspricht 44 MegaBytes.

  • Die maximale Auflösung einzelner Bilder in der Standardversion der Bilder beträgt etwa 1500x4000 px, während die Mindestgröße bei 60x60 px liegt.

  • Die maximale Auflösung einzelner Bilder in der Retina-Version der Bilder beträgt etwa 3000x8000 px, während das Minimum bei 120x120 px liegt.

  • Retina-Version der Bilder haben "@ 2x ~ ipad" Suffix in ihrem Namen, während der Name Suffix für die anderen ist "~ ipad".

  • Es gibt nur eine Instanz der meisten Bilder, die während des App-Lebenszyklus erstellt werden.

  • Etwa 25 der Bilder werden während des App-Starts geladen und der Rest wird während des Spiels geladen.

  • Ich habe verwendet [UIImage imagenamed: @ "image_name.png"], wo ich ein Bild geladen werden soll (mit [UIImage imageWithContentsOfFile] und [UIImage imageWithData] war äußerst ineffizient).

Aber hier ist es ein Problem:

Wenn ich die Speichernutzung Instruments verfolgen mit Ich sehe, dass App-Speicherverbrauch extrem hoch ist. Hier sind die Statistiken der Speicherzuordnung der in verschiedenen Situationen:

  • zugewiesener Speicher auf dem iPad 2 unter Verwendung von Standard-Images beim Start: 58 MB

  • zugewiesener Speicher auf dem iPad 2 unter Verwendung von Standard-Bildern während des Spiels (wenn alle Bilder geladen): 131 MB

  • zugewiesener Speicher auf neue iPad mit Retina-Bilder beim Start: 211 MB
  • zugewiesener Speicher auf neue iPad mit Retina-Bilder während des Spiels (wenn alle Bilder geladen sind): 470 MB

Irgendwelche Ideen, warum zugewiesener Speicher viel höher ist als die Gesamtgröße von Bildern?

+0

Warum laden Sie alle Bilder in den Speicher? Sie sollten die Verwendung von UIImage imageNamed vermeiden und stattdessen UIImage imageWithContentsOfFile verwenden, da das Bild später nicht dauerhaft im Speicher geladen wird. Auch wenn Ihre Bilder sehr groß sind, sollten Sie sie in einer CATiledLayer-Klasse zeichnen sie effizienter auf den Bildschirm – Lefteris

+0

Ich lade alle Bilder im Speicher, weil sie alle vor und während des Spiels benötigt werden. Es folgt nicht einem üblichen Design wie andere Apps, und es ist erforderlich, diese Bilder zu laden. Mit anderen Worten, ich lade jedes Bild nur, wenn es benötigt wird, aber das Problem ist, dass es beim Start alle geladen werden muss: D –

Antwort

0

Dies ist wahrscheinlich aufgrund der Tatsache, dass die Bilder, die Sie verwenden, mit Png oder Jpg komprimiert werden, und wenn in Arbeitsspeicher dekodiert sind viel größer als die ursprüngliche Dateigröße. Es wird etwas wie width * height * 4 Bytes Speicher unabhängig vom Bildinhalt aufnehmen.

+0

Gibt es eine andere Komprimierungsmethode oder eine andere Erweiterung, die ich verwenden kann, um zu verhindern so viel Speicherverbrauch? –

0

ein Start in nicht Verwendung -[UIImage imageNamed:] für die Bilder, die eine der Qualifikationen passen würde:

  • großformatigen
  • mittlere
  • „... nur eine Instanz ... während der App erstellt Lebenszyklus."

aber Sie müssen darauf achten, wie diese Änderungen Ihr Programm beeinflussen. Sie verlassen sich derzeit auf Speicher, wo immer es möglich ist. Was ich vorschlage, ist, einige dieser Verantwortlichkeiten auf andere Bereiche zu verlagern. Verteilen Sie die Ladung so, dass sie sich immer noch schnell anfühlt, aber die Ressourcen besser ausbalanciert sind. Sobald Sie weniger Caching verwenden, werden Sie feststellen, dass Sie möglicherweise einige Dateien mehr als einmal lesen und erweitern. dann versuchen Sie herauszufinden, wo Sie Bilder teilen sollten, die Sie laden. Lade natürlich nur das, was du brauchst. dann nimm, was du lernst und sieh, dass es auf den Rest deiner Bilder angewendet werden kann.

auch, brechen Sie Ihre Bilder auf - Sie haben Bilder, die mehrere Male größer als die Größe des Displays sind. wenn sie diese Größe haben müssen, dann zerbrich sie - wenn sie nur verkleinert werden, wenn sie präsentiert werden, dann skaliere sie vor der Verteilung (z. B. brauchen sie keine Skalierung), es wird viel schneller angezeigt, sieht viel besser aus, und verbrauchen weniger Speicher).