#c# #.net #mono #xna #monogame
#c# #.net #моно #xna #моногейм
Вопрос:
Необходим ли такой класс?
public class ContentCache
{
private readonly ContentManager _content;
private readonly Dictionary<string, Texture2D> _textureCache = new Dictionary<string, Texture2D>();
public ContentCache(ContentManager content)
{
_content = content;
}
public Texture2D Load(string assetName)
{
Texture2D texture = null;
if (!_textureCache.TryGetValue(assetName, out texture))
{
_textureCache[assetName] =
texture = _content.Load<Texture2D>(assetName);
}
return texture;
}
}
Мне любопытно ContentManager.Load<Texture2D>()
, использует ли он собственное кэширование внутри. Я не хочу дважды кэшировать вещи.
Примечание:
Наша игра XNA 2D и будет работать на WP7 и Windows, а также iOS и OSX с использованием MonoGame.
MonoGame может функционировать иначе, чем XNA в Windows, но я, вероятно, могу просмотреть его исходный код, чтобы выяснить это.
Комментарии:
1. Это был отличный вопрос. Оказывается, я писал класс, почти идентичный вашему, по тем же причинам. Приятно знать, что это больше не нужно в соответствии с полученными вами ответами.
Ответ №1:
Класс не нужен. ContentManager делает это от вашего имени.
Источник:
http://forums.create.msdn.com/forums/p/31383/178975.aspx
Примечание:
Что касается Mono… Я уверен, что реализации отражают друг друга довольно хорошо, но я не могу быть уверен в этом случае.
Кроме того, если вы ХОТИТЕ повторно загрузить ресурс, вы можете использовать дополнительный ContentManager и выбросить его позже.
Комментарии:
1. Мы можем сохранить его в зависимости от того, что делает MonoGame. Я проверю исходный код и отправлю его обратно.
2. Похоже, что MonoGame не кэширует какие-либо файлы содержимого: github.com/mono/MonoGame/blob/master/MonoGame . Фреймворк / Контент/… Поэтому я думаю, что мы собираемся использовать этот класс и некоторые
#if MONOGAME
инструкции препроцессора, а не использовать кэширование в обычном XNA.3. MonoGame, безусловно, ДОЛЖНА кэшировать ресурсы так же, как Xna framework. Если это все еще не так, почему бы не реализовать это в ContentManager, где это должно быть. Смотрите Этот поток для получения некоторого кода с голыми костями: monogame.codeplex.com/discussions/273478
4. Связанный источник больше недействителен и нуждается в обновлении.
Ответ №2:
Следует отметить, что Mono class ContentManager теперь также выполняет кэширование.
Добавлено где-то в 2012 году. Для дальнейшего использования.
Ответ №3:
Просто кэшируйте то, что должно быть кэшировано в первом методе LoadContent, используя некоторый массив строк предварительного кэша, например:
// Preload assets
static readonly string[] preloadAssets =
{
"Textures\texture1",
};
protected override void LoadContent()
{
foreach ( string asset in preloadAssets )
{
Content.Load<object>(asset);
}
}
Возможно, что-то в этом роде!
Комментарии:
1. Это не является целью моего вопроса или класса. Я думаю, вы немного упускаете вопрос. Мой класс — ленивая загрузка текстур и их кэширование, если они запрашиваются снова.