2015-07-21 5 views
6

Meine App UIKit speichert so etwas wie 100 (100x100) jpeg Dateien, die als "Musterbild" verwendet werden sollen. die durchschnittliche Größe für jedes Bild ist manchmal wie 20~40 kb.IOS - Best Practice für die Verarbeitung einer großen Anzahl von Bildern (Leistung + Größe auf der Festplatte)

Ich bin auch cocos2d-x-Entwickler. In Cocos-Umgebung verwende ich plist, um jedes Bild zu "binden" und dann über plist zu schneiden. Dies ist eine großartige Leistung und Größe sparen, aber soweit ich weiß, ist es nicht möglich, auf UIKit.

Also meine Frage ist das, Gibt es eine bessere Möglichkeit, diese Bilder zu speichern/ziehen, um die Kapazität der Festplatte zu verbessern und die Leistung zu erhöhen, außer Drag & Drop die Dateien in XCode und wie gewohnt verwenden?

+0

100 100x100 Bilder nicht so viel Speicher. Vorausgesetzt, alle sind geladen, sind das (100 * 100 * 100 * 4) Bytes Speicher bei der Decodierung, was nur 4 MB ist. UIKit wird die Deduplizierung Ihrer Ressourcen übernehmen und sie auch in Umgebungen mit wenig Arbeitsspeicher zwischenspeichern und freigeben. Daher denke ich, dass dies nur eine vorzeitige Optimierung ist. –

+0

Richard hat recht, dass die Menge an Speicher nicht so schlecht ist, aber wenn du es wirklich brauchst, könntest du diese Bilder in ein einzelnes Sprite verwandeln und dann mit Coords aufrufen. Ich habe diese Seite schon vorher für CSS Sprite verwendet http://spritegen.website-performance.org – Cole

+0

@Cole, das ist nicht gut für die Leistung auf iOS - die Gewinne, die Sie für Cache-Lokalität erhalten, sind minimal, und wie ich zuvor erwähnt UIKit führt einige fortgeschrittene Caching-Techniken durch, um sicherzustellen, dass nur verwendete Bilder zu jeder Zeit im Speicher bleiben. Auch Bilder über 1024x1024 schneiden auf älteren Geräten sehr schlecht ab (aufgrund eines Hardware-Limits im Texturpuffer müssen die Bilder von UIKit gekachelt werden). –

Antwort

2

[beliebige Anzahl] von Bildern ist nicht wirklich ein Problem auf iOS, da es erweiterte Caching-Systeme gibt, die für die Wiederverwendung der Bilder sorgen. Auch das Rendering-System von iOS ist ziemlich gut, so dass Sie sich keine Sorgen machen müssen.

Während es sicherlich möglich ist, das System für Sprites zu programmieren, würde ich dir nicht raten, es zu tun. Diese Methode wird hauptsächlich in der Webentwicklung verwendet (weil jedes Bild mit einer neuen Anfrage * Note no longer true with HTTP/2) geliefert werden muss und natürlich auch für die Spieleentwicklung (weil die weniger bindenden Texturaufrufe die bessere haben).

Es gibt noch ein gutes Beispiel dafür, warum Sprites nicht verwendet werden sollten - wenn Sie die Watch-Anwendung entwickeln und Animationen erstellen möchten, tun Sie dies über Flipboard-Style-Bilder (Bilderfolge 1.png - 100.png) und nicht mit einem großen Atlas von Bildern. Während es raten würde, warum sie sich dafür entschieden haben, es so zu machen (meine Annahme wäre wegen, wie gut es intern + Durchsatz des Bluetooth funktioniert), ist es offensichtlich, dass es auch bevorzugte Wahl von Apple ist und so sollten wir folgen .

Für iOS gibt es einige Fallen, die Sie wissen sollten:

  • Jede aus dem Web geladen Bild sollte nicht auf Hauptthread geladen werden, das gleiche gilt wirklich mit jedem Bild, das an der Last nicht vorhanden ist des Bildschirms (Bilder in UITableViewCell sind ein gutes Beispiel, weil Sie Mini-Freezes sehen können, wenn die Bilder groß sind, wie Sie durch scrollen)
  • Wenn Sie viele Ebenen haben, Bilder mit Alpha-Kanal! = 1 Leistung stark verringern (aber sind oft unvermeidbar)
  • Hintergrundbild erstellt mit UIColor.colorWithPatternImage() sollte b e mit Vorsicht verwendet werden, da diese Methode als problematisch angesehen wird (details here)

Jetzt als für asynchronen Laden der Bilder, empfehle ich Sie in der folgenden Bibliotheken einen Blick:

Beide sind groß, so dass es wirklich Frage der Präferenz ist (wie ich Haneke bett er), aber Sie können Bilder auf verschiedenen Threads herunterladen, sei es aus dem Web oder aus Ihrem Bundle. Sie haben auch Erweiterungen für UIImageView, mit denen Sie 1-Linien-Funktion verwenden können, um alle Bilder einfach zu laden.

Hoffe es hilft!

+0

Vielen Dank für Ihre Antwort, Das Speicherleck, das colorWithPatternImage möglicherweise erstellt wird, ist ein sehr nützliches Detail, auch über die Seiteninfo :) Danke! –

+0

immer froh zu helfen! –

1

Es wird in iOS 9 sein, wenn das zählt;) Es heißt On Demand Resources und können Sie Inhalte mit Apple speichern und den Inhalt herunterladen, wenn es für ein Level benötigt wird usw. Es wird großartig für Spiele-Apps und ist Was sie als Beispiel auf der WWDC verwendet haben.

bestellen hier aus: https://developer.apple.com/library/prerelease/ios/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/

+0

Sehr nützliche Info, danke für Ihre Antwort @Drorgan! –