Ich habe Tausende von PNG-Dateien, die ich mit libpng lade und dann OpenGLES-Texturen für die Verwendung in der Anwendung erstelle. Dies verursacht eine große Ladezeitverzögerung auf dem iPhone. Gibt es eine Möglichkeit, die Ladezeit zu beschleunigen?Viele png-Dateien, die zur Verwendung mit OpenGLES in Texturen geladen werden, verursachen langsame Ladezeiten.
Antwort
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]
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.
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.
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
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
- 1. Langsame Ladezeiten: ISP oder Codierung
- 2. android/opengles alpha Texturen nicht halbtransparent aber binär transparent
- 3. Chrome DevTools: Langsame Frames, aber keine Ereignisse, die sie verursachen
- 4. Werden zu viele Tags in Git Probleme verursachen?
- 5. Berechnung von Javascript Bibliothek Ladezeiten
- 6. SQL Server: langsame Abfrage, viele Likes
- 7. MySQL viele zu viele Tabelle verbinden langsame Leistung
- 8. Was könnte dieses langsame Fetch im reaktiven nativen verursachen?
- 9. Sprites erhalten, um die Kamera in OpenGLES
- 10. Heroku mit Ruby 1.9.3 verursachen viele verschiedene Abstürze
- 11. Wie werden alle Dateien in einem Ordner mit XNA geladen?
- 12. Floating Point Texturen in OpenGL ES 2.0
- 13. Wie kann ich Ladezeiten auf einer statischen HTML-Site verbessern?
- 14. Langsame Internetgeschwindigkeit = Langsame Daten gesammelt?
- 15. Wie kann diese langsame (sehr langsame) MySQL-Abfrage optimiert werden?
- 16. Alternative zur Verwendung der Beziehung mit SQLite
- 17. zu viele Ergebnisse und langsame Ergebnisse in Mysql/PHP-Suchmaschine
- 18. Langsame Antwortzeiten von IIS
- 19. Wird die abgeleitete Klassentyp-Kompatibilität zur Basisklasse einen Speicherverlust verursachen?
- 20. Assets, die langsam in Entwicklung geladen werden
- 21. Die Ressource konnte nicht geladen werden ios9
- 22. Mit opengles Shader YUV in RGB konvertieren
- 23. Protokollspeicherzugriffe, die schwerwiegende Seitenfehler verursachen
- 24. Echo verursacht langsame Leistung mit großen Zeichenfolge
- 25. Kann die Verwendung von Kernel-Parametern Bankkonflikte verursachen?
- 26. glVertexAttribPointer in OpenGL und in OpenGLES
- 27. Texturen gerendert als Farbfelder
- 28. Masstransit Verwendung RabbitMQ ist sehr langsame Leistung?
- 29. Langsame Benutzerauthentifizierung mit TeamFoundationServerFactory
- 30. Muss Spamassassin zur Verwendung kompiliert werden?
Warum helfen weniger, aber größere Texturen so sehr? Gibt es viel Overhead für Texturen? – CustomAppsMan
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. –