2009-06-29 3 views
2

Im пишет программу XNA, которая отображает изображения из определенного фотоальбома на Zune. Проблема в том, что, если я загружаю текстуры из всех изображений в альбоме, у программы заканчивается память. Я попытался загрузить один за другим и вызвать Dispose на предыдущей текстуре изображения, как только пользователь перейдет к следующему изображению. Это работает, но затем я не могу вернуть текстуру с предыдущей картинки после ее удаления, чтобы пользователь не мог просматривать предыдущие фотографии без перезапуска программы!Как загрузить изображения в Zune XNA без исчерпания памяти?

+0

Почему бы просто не перезагрузить его, используя ту же логику? – GalacticCowboy

+0

Ну, есть иерархия фотоальбомов, которые мне нужно пройти, чтобы получить все снимки, а затем я должен отсортировать их в порядке, прежде чем представлять их пользователю. Было бы безумно делать это каждый раз, когда пользователь нажимает кнопку «Назад», чтобы посмотреть прошлые снимки. Разумеется, есть лучшее решение? – anonymous

ответ

1

Не храните маркер текстуры в каждом элементе в своем альбоме. Вместо этого используйте один дескриптор уровня программы, который вы размещаете и загружаете по мере необходимости, когда пользователь просматривает альбом.

+0

Yup это то, что я делаю. У меня есть только один обработчик текстуры, ссылающийся на одну текстуру изображения в любое время. Но как только вы получите доступ к текстуре с изображения, текстура не исчезнет, ​​даже когда я назначу другую текстуру для дескриптора. Кажется, он где-то кэширован. Если я вызову Dispose на текстуре, я не могу вернуть текстуру из изображения. Он будет продолжать возвращать null каждый раз, когда я вызываю GetTexture. – anonymous

+0

Можете ли вы разместить код? Вы уверены, что это проблема с текстурой? То есть поддерживает ли файловая блокировка, которая не очищается при загрузке следующего файла, а затем запрещает вам перезагружать предыдущий файл? – GalacticCowboy

+0

Thx за то, что так полезно! Я действительно изменил код, так как теперь изображения должны быть прикреплены к проекту XNA и скомпилированы вместе как файлы XNB. Он работает, так как теперь я могу использовать ContentManager для загрузки и выгрузки моих изображений. Однако это не очень хорошее решение, поскольку, если мне нужно добавить, удалить или изменить изображение, мне придется перекомпилировать и развернуть всю программу! У меня нет времени, но в выходные я напишу небольшую программу, чтобы воссоздать проблему и опубликовать код. – anonymous

0

Я бы предложил выполнить всю обработку данных только один раз и сохранить имя файла (так что вам нужно только выполнить всю иерархию/сортировку один раз). Затем загружайте изображение только тогда, когда хотите (именно то, что предлагалось в предыдущем посте).

Проблема с этим методом заключается в том, что Content.Load (string) загрузит вашу текстуру, однако если вы потеряете все указатели на текстуру, ContentManager сохранит текстуру в памяти, так что, если вы ее снова загрузите, она будет загружаться мгновенно , Существует метод Content.Unload(), который будет падать эти кэшированные элементы, см:

форум для обсуждения по этой теме:
http://forums.xna.com/forums/p/25978/141761.aspx
Shawn Hargreaves объясняет это:
http://blogs.msdn.com/shawnhar/archive/2006/09/06/743437.aspx

так, как я это будет либо вызывать разгрузку при каждом прекращении использования изображения, либо если вы хотите более быструю загрузку (это зависит от того, как часто пользователь меняет изображение, если они предназначены для того, чтобы пролистывать изображение, действительно быстро выгружая каждый раз плохая идея) пытаются выхватить из памяти исключения и только вызывать разгрузку эн.

+0

Thx за помощь! Да, я обычно использую отдельный ContentManager для каждой текстуры, чтобы я мог его выгрузить, если потребуется. Однако API-интерфейс Zune Picture API не использует и не предоставляет ContentManager, чтобы я мог контролировать загрузку и выгрузку. Он имеет только один метод, называемый GetTexture. Он не использует обычный шаблон Content.Load! Вот почему я так напуган! :-( – anonymous

+0

Ahh, я не понимал, что это значительно отличается на zune.Если вы немного читаете в MSDN (и это полная догадка), не могли бы вы просто не позвонить на изображение (не текстуру, а картинку, которую вы назвали GetTexture), которая должна освободить все неуправляемые ресурсы, используемые изображением (в том числе его текстуры) – Martin