Кэширование XNA Texture2D

#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. Это не является целью моего вопроса или класса. Я думаю, вы немного упускаете вопрос. Мой класс — ленивая загрузка текстур и их кэширование, если они запрашиваются снова.