Лучшая структура для кеша, как структура данных в C #? - PullRequest
2 голосов
/ 15 ноября 2010

это был скорее концептуальный вопрос, но мне было интересно, какова лучшая структура данных C # для структуры, подобной кешу. Я объясню, что я ищу.

Я делаю игру, которая использует спрайты для графики. Спрайты основаны на изображениях (изображения библиотеки SFML, а не стандартные изображения C #, но я не думаю, что это действительно имеет значение). Эти изображения должны быть загружены из файла на диске, и это может стать дорогостоящим (по времени), когда нужно быстро создать много спрайтов. Чтобы уменьшить часть этого времени загрузки, я хочу использовать структуру, похожую на cahce, для хранения файлов изображений и времени их последнего обновления (я буду использовать это время обновления, чтобы определить, когда удалять файлы из кэша). Кэш будет проиндексирован с использованием комбинации имени спрайта и нескольких других деталей. этот индекс будет соответствовать структуре, как показано ниже:

struct ImageEntry
{
    Image image;
    TickCount lastupdate;
    TickCount evictionTime;
}

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

Теперь вот что мне нужно сделать: периодически мне нужно бегать по всему кешу, сравнивать последние обновления каждой структуры с текущим игровым временем. Если разница между этими двумя значениями превышает время удаления, я хочу удалить запись struct из кэша. Кроме того, если запрос спрайта выдает новую структуру, а размер кэша превышает предварительно определенное значение, мне нужно найти наименее недавно обновленную структуру и удалить ее, чтобы освободить место для новой структуры.

По сути, я ищу идеальную структуру данных, которая имеет быстрый поиск для индексации ключей и быструю итерацию для времени обновления / исключения из-за переполнения размера.

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

Для справки, я, вероятно, собирался ограничить размер изображения примерно 30-40 снимками за раз, и он колеблется от 2 до 500 кб, а время выселения обычно составляет около 6 минут. Я хотел бы иметь возможность проверять выселение хотя бы каждые 1-2 секунды

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

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

Если вы разрабатываете под .NET 4, вы также можете попробовать встроенный класс MemoryCache: http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache.aspx

В любом случае вам следует провести тестирование производительности, чтобы убедиться, что ваше приложение работает нормально.

1 голос
/ 15 ноября 2010

Класс в библиотеке, которую я написал, может вдохновить вас - он похож, но не имеет основанного на времени удаления кэша, который вы описываете:

https://github.com/xpaulbettsx/ReactiveXaml/blob/master/ReactiveXaml/MemoizingMRUCache.cs#L31

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...