Im Schreiben eines XNA-Programms, das Bilder aus einem bestimmten Bildalbum auf dem Zune anzeigt. Das Problem ist, wenn ich die Texturen von allen Bildern im Album lade, hat das Programm nicht genügend Speicherplatz. Ich habe versucht, eins nach dem anderen zu laden und Dispose auf der vorherigen Bildtextur anzurufen, sobald der Benutzer zum nächsten Bild weitergeht. Das funktioniert, aber dann kann ich die Textur nicht mehr vom vorherigen Bild erhalten, sobald sie entsorgt wurde, so dass der Benutzer die vergangenen Bilder nicht mehr ansehen kann, ohne das Programm neu zu starten!Wie lade ich Bilder in Zune XNA, ohne den Arbeitsspeicher zu leeren?
Antwort
Speichern Sie den Texturgriff nicht in Ihrem Album. Verwenden Sie stattdessen ein einzelnes Handle auf Programmebene, das Sie bei Bedarf freigeben und laden, wenn der Benutzer das Album durchläuft.
Yup das ist was ich mache. Ich habe nur ein Textur-Handle, das zu jeder Zeit auf eine Bildtextur verweist. Sobald Sie jedoch von einem Bild auf die Textur zugreifen, wird die Textur nicht mehr entfernt, auch wenn ich dem Griff eine andere Textur zuweise. Es scheint irgendwo zwischengespeichert zu werden. Wenn ich Dispose für die Textur anrufe, kann ich die Textur aus dem Bild nicht wiederherstellen. Es wird immer Null zurückgeben, wenn ich GetTexture aufruft. – anonymous
Können Sie etwas Code posten? Bist du sicher, dass es ein Problem mit der Textur ist? I.e. Wird eine Dateisperre beibehalten, die beim Laden der nächsten Datei nicht gelöscht wird, und verhindert, dass Sie die vorherige Datei erneut laden? – GalacticCowboy
Danke für Ihre Hilfe! Ich habe den Code seit dem geändert, wo Bilder nun an das XNA-Projekt angehängt und zusammen als XNB-Dateien kompiliert werden müssen. Es funktioniert, da ich jetzt ContentManager zum Laden und Entladen meiner Bilder verwenden kann. Dies ist jedoch keine gute Lösung, denn wenn ich ein Bild hinzufügen, entfernen oder ändern muss, muss ich das gesamte Programm neu kompilieren und bereitstellen !! Ich habe jetzt keine Zeit, aber am Wochenende werde ich ein kleines Programm schreiben, um das Problem neu zu erstellen und den Code zu posten. – anonymous
Ich würde vorschlagen, alle Ihre Datenverarbeitung nur einmal, und speichern Sie den Dateinamen (so müssen Sie nur alle Ihre Hierarchie/Sortierung einmal tun). Dann lade nur ein Bild, wenn du es willst (genau das, was der vorhergehende Post vorgeschlagen hat).
Das Problem mit dieser Methode ist, dass Content.Load (string) Ihre Textur lädt. Wenn Sie jedoch alle Zeiger auf die Textur verlieren, behält der ContentManager die Textur im Speicher, so dass beim nächsten Laden sofort geladen wird . Es gibt ein Verfahren Content.Unload(), die diese zwischengespeicherten Elemente fallen wird, finden Sie unter:
Ein Forum Diskussion zu diesem Thema:
http://forums.xna.com/forums/p/25978/141761.aspx
Shawn Hargreaves erklärt es:
http://blogs.msdn.com/shawnhar/archive/2006/09/06/743437.aspx
So wie ich würde dies implementieren, um entweder Entladen jedes Mal aufzurufen, wenn Sie aufhören, ein Bild zu verwenden, oder wenn Sie schneller laden möchten (dies hängt davon ab, wie oft ein Benutzer Bild ändert, wenn sie schnell durch das Bild blättern sollen, ist jedesmal ein Entladen) schlechte Idee) versuchen, aus dem Speicher Ausnahmen zu fangen und nur unload th aufrufen de.
Danke für den Versuch zu helfen! Ja, ich verwende normalerweise einen separaten ContentManager für jede Textur, so dass ich sie bei Bedarf löschen kann. Die Zune Picture-API verwendet jedoch keinen ContentManager, um das Laden und Entladen zu steuern. Es hat nur eine Methode namens GetTexture. Es verwendet nicht das normale Content.Load-Muster! Deshalb bin ich so frustriert! :-( – anonymous
Ahh, ich wusste nicht, dass es auf der Zune signifikant anders war.Wenn Sie etwas auf der MSDN nachlesen (und das ist eine vollkommene Vermutung), könnten Sie nicht einfach das Bild aufrufen (nicht die Textur, sondern das Bild, das Sie GetTexture genannt haben), das alle nicht verwalteten Ressourcen freigeben soll seine Textur) – Martin
- 1. Wie verarbeiten Sie viele Dateien, ohne den Arbeitsspeicher zu leeren? R
- 2. Wie lade ich Bilder vor?
- 3. Wie lade ich Bilder in uitableview?
- 4. Wie lade ich Bilder auf den Webserver hoch?
- 5. Wie erstelle ich einen großen Pandas-Datenrahmen aus einer SQL-Abfrage, ohne den Arbeitsspeicher zu verlieren?
- 6. Wie lade ich Bilder in GridView innerhalb von ListView?
- 7. JavaScript: Wie lade ich alle Bilder in einem Ordner?
- 8. Wie lade ich Anaconda-Pakete herunter, ohne sie zu "installieren"?
- 9. Wie schreibe ich riesige Daten in Textdatei mit JDBC, ohne den Speicher zu leeren
- 10. CSS3 Marquee Effekt, ohne den leeren Raum
- 11. Wie lade ich mehrere Bilder in Django mit Dropzone hoch und speichere den Pfad dynamisch?
- 12. Wie lade ich den node.js Server?
- 13. Wie lade ich Daten in eine MySQL-Tabelle ohne Leerzeichen?
- 14. Wie unterteile ich eine sehr große OpenStreetMap-Datei in kleinere Dateien in R, ohne den Arbeitsspeicher zu verlieren?
- 15. Wie lade ich Bilder mit dem Web Worker?
- 16. Wie lade ich den Twitter-Button neu?
- 17. Rebol Draw: Wie lade ich Bilder aus dem Internet?
- 18. Symfony2: Wie lade ich eine Datei ohne Doctrine hoch?
- 19. Wie kann ich einen Zeilenumbruch drucken, ohne den Puffer zu leeren?
- 20. Ubercart: Wie kann ich den Wagen leeren?
- 21. Lade Bilder in nativer UIImagePickerController allowsEditing
- 22. Finde und lade gecachete Bilder in Glide
- 23. Lade den Inhalt in 2 verschiedenen div
- 24. Wie habe ich meine Bilder nebeneinander ohne „Float“ zu verwenden?
- 25. swift: Wie lade ich Fotos aus der Fotobibliothek, ohne UIImagePickerController zu verwenden?
- 26. Wie komprimiere ich mehrere Bilder und lade den FTP-Server von der iPhone App hoch?
- 27. Wie pausiere ich das Neuzeichnen in XNA?
- 28. Wie verwende ich XNA in WPF?
- 29. Wie lade ich gdbinit neu?
- 30. Wie lade ich ein riesiges Bild über BufferedImage nach Java?
Warum nicht einfach neu laden, mit der gleichen Logik? – GalacticCowboy
Nun, es gibt eine Hierarchie von Bildalben, die ich durchlaufen muss, um alle Bilder zu erhalten, und dann muss ich sie sortieren, bevor ich sie dem Benutzer präsentiere. Es wäre verrückt, dies jedes Mal zu tun, wenn der Benutzer die Zurück-Taste drückt, um sich die vergangenen Bilder anzusehen. Sicherlich gibt es eine bessere Lösung? – anonymous