2009-08-06 3 views

Antwort

0

Sie können mehrere Texturen in einer großen Textur (1024x1024) platzieren. Dies erfordert jedoch eine gewisse Neuberechnung der Texcoords. Versuchen Sie auch, die Texturteile nahe an der tatsächlichen Auflösung zu halten, die beim Zeichnen verwendet wird, dh wenn eine Textur eine halbe Bildschirmhöhe (240px) füllt, ist es gut genug, um eine Textur von 256x256 zu verwenden.

Dann könnte eine erweiterte Methode (nicht getestet) sein, alle Dateien zu verketten (+ Registrierung ihrer Länge + pos) und dann mmap(..) verwendet, um auf diese Png-DB-Datei zuzugreifen. Verwenden Sie dann NSData, um die Funktion zum Laden von Texturen zu verwenden, wenn diese auf UIImage basiert. Die gute Sache mit der Verwendung von mmap(..) ist, dass man nicht viele Dateien öffnet und schließt und der Zugriff auf die Daten mit Hilfe des Betriebssystem-VM-Managers erfolgt.

[Anmerkung: Ja, iPhone nativen PNG loader Mangeln einige png erfordern ... vielleicht einen keine einheimischen Leser müssen dann oder verstümmelten Dateien verketten statt]

0

Wissen Sie, in welcher Reihenfolge wirst du brauchen Ihre Tausende von Bildern in? Vielleicht können Sie beim Start Ihrer App nur ein paar hundert laden und dann mehr auf einen Hintergrund-Thread laden.

Die Kombination von kleinen Bildern mit weniger größeren Texturen ist auch eine gute Idee, wiederum nur dann, wenn es ein Muster dafür gibt, welche Bilder zusammen verwendet werden.

+0

Warum helfen weniger, aber größere Texturen so sehr? Gibt es viel Overhead für Texturen? – CustomAppsMan

+0

Es gibt einige zusätzliche Arbeit beim Öffnen jeder Datei, auch wenn Ihre Bilder nicht quadratisch sind und eine Zweierpotenz in Höhe/Breite Sie weniger Texturspeicher verwenden, kombinieren Sie sie. –

1

In der Regel habe ich ein Objekt erstellt, das das verzögerte Laden meiner Texturen über einen Manager übernimmt. Beim Start registriere ich meine bekannten Texturen und lösche ihre Dateisystemattribute, die ich später brauche, um beim Laden ein einfaches IO zu speichern, dann ziehe ich sie, wenn sie benötigt werden.

Um die Dinge zu beschleunigen, habe ich eine Batch-Ladung Mechanismus, wo ich sage "Laden Sie diese Anordnung von Bildern und zurück zu mir." Dies ist einfach, um den Overhead von wiederholten Methodenaufrufen zu entfernen. In der Tat ist meine Single-Load-Lösung nur ein einfacher Wrapper rund um meine Batch-Ladung.

Auf diese Weise beim Start ich meine Buchhaltung (Objekt Erstellung, Dateisystem-Attribut-Erkennung, etc), sondern verschieben Sie schwere Arbeit, bis sie notwendig sind. Wenn ich zur Laufzeit Texturen in meine App lade, werden Fehler ausgelöst, die die Texturen vom Speicher bis zum Texturspeicher füllen. Wenn ich eine Szene mit vielen bekannten Texturen lade, lade ich den Satz sehr gebräuchlicher Texturen in einen Prefetch, verschiebe aber relativ unübliche Texturen zur Laufzeit.

In der Praxis funktioniert dies aufgrund der damit verbundenen Wahrscheinlichkeiten. Wenn Sie die Last zum Startzeitpunkt erzwingen, werden Sie alle Texturen gleichzeitig sehen, während das sporadische Laden die erwartete Latenz der Benutzer nach Beladung verringert Zeitlatenz * Wahrscheinlichkeit, dass sie innerhalb eines Zeitfensters vom Start an geladen wird. Wenn Sie den Start-Prefetch optimieren, um keine Texturen zu laden, verringern Sie die erwarteten Latenzen erheblich.

Zusätzlich können Sie die Verwendung von NSURLConnection:connectionWithRequest:delegate: zum Laden Ihrer Texturen aus dem Speicher in Betracht ziehen. Es ist asynchron, so dass Sie es bitten können, Ihre größten asynchron und Ihre kleineren synchron zu laden, um IO/CPU Leerlauffaktoren während Dateisystemabrufen/Texturdekomprimierung zu nutzen (große Dateien laden lange, während kleine Dateien schnell laden und bei der gleiche Zeit). Sie sollten dies jedoch testen, da das iPhone den asynchronen Dateisystemzugriff möglicherweise nicht gut beherrscht.

+0

Zu jeder Zeit lade ich nur die Bilder aus den PNG-Dateien in das Programm und lade sofort die Texturen aus, die zum aktuellen Zeitpunkt benötigt werden. Mit anderen Worten, ich lade nicht alle Dateien gleichzeitig. Allerdings brauche ich zu jeder Zeit mindestens 1000 Png, die in Texturen geladen werden, die zur Anzeige bereitstehen. – CustomAppsMan

+0

Also, wenn ich NSURLConnection oder Threads verwende, sollte ich mehrere Png-Dateien gleichzeitig laden, anstatt es seriell zu tun, und dies wird schneller sein? – CustomAppsMan

Verwandte Themen