2009-06-29 18 views
2

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?

+0

Warum nicht einfach neu laden, mit der gleichen Logik? – GalacticCowboy

+0

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

Antwort

1

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.

+0

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

+0

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

+0

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

0

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.

+0

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

+0

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