XNA Как ContentManager справляется с памятью - PullRequest
2 голосов
/ 25 марта 2012

Мой вопрос не ясен в заголовке [я не могу написать его точно]

например, Texture2D picture = Content.Load<Texture2D>("myPicture");

что происходит с памятью, если код, приведенный выше, выполняется?Как я знаю, Content кеширует «myPicture» в память и возвращает ссылку на изображение Texture2D.Я ошибся ?Если «myPicture» загружен в другой объект Texture2D, «myPicture» не дублируется, поэтому он возвращает только ссылку.

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

Спасибо!

1 Ответ

10 голосов
/ 26 марта 2012

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

ReferenceEquals(Content.Load<Texture2D>("something"),
                Content.Load<Texture2D>("something")) == true

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

Чтобы выгрузить ресурсы и очистить этот внутренний список, вызовите ContentManager.Unload.Это освободит память, которую использовали загруженные ресурсы.Теперь, если вы снова запросите тот же ресурс - он будет перезагружен.

Конечно, если вы используете эти ресурсы при вызове Unload, все эти общие экземплярыто, что вы загрузили, будет утилизировано и непригодно для использования.

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

...