Re[4]: Стратегии кэширования ресурсов игры.
От: lextasy Украина www.mira-tech.com.ua
Дата: 30.08.04 09:54
Оценка:
Здравствуйте, _Winnie, Вы писали:

__W>Подскажите простую, непротиворечивую, красивую систему.


Общие соображения:

Все стратегии кэширования внешних данных одинаково плохи до тех пор, пока не соблюдается хотя бы одно из следующих условий:
1) Стратегия кэширования явным образом учитывает схему данных и правильно вычисленную _априорную_ частоту и длительность их использования. Обычно этот подход не используется, т.к. схема данных считается изначально неизвестной.
2) Данные кластеризованы таким образом, чтобы при текущей стратегии их кэширования хотя бы частично выполнялось первое условие. Этот подход используется чаще, хотя и дает худшие результаты.

Вывод:

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

Пример:

Никакая универсальная стратегия кэширования не сможет сама определить, что лучше использовать:
map<pair<X,Y>, Z> или map<pair<Y,X>, Z>.

Предложение:

Аналогично графу PVS, строишь граф потенциально загружаемых ресурсов. Его используешь в следующих целях:
1) Для определения приоритета каждого ресурса;
2) Для упреждающей загрузки реурсов мелкими порциями, чтобы игра "подвисала" не редко и надолго, а постоянно и как бы незаметно. Квоту для каждого ресурса можно установить отдельно и сохранить для последующего использования, либо просто использовать таймер для ограничения кол-ва предварительно загружаемых ресурсов.
3) С кажой вершиной этого графа еще на этапе компиляции ресурсов можно сопоставить "временную метку" — т.е. время их последнего использованияупорядочить в соответствии с логикой прохождения игры. Эти метки можно использовать для выгрузки однозначно неиспользуемых ресурсов.
4) Ресурсы обязательно должны быть кластеризованы, т.к. повторного кэширования их виндой избежать не удастся, а винда все обрабатывает блоками по 64 кило.