4.0 KiB
4.0 KiB
AssetsManager
Документ описывает реализацию AssetsManager на стороне клиента.
Назначение
AssetsManager объединяет в одном объекте:
- таблицы привязок ресурсов (domain/key -> localId, serverId -> localId);
- загрузку и хранение ресурсов из ресурспаков;
- систему источников данных (packs/memory/cache) с асинхронной выдачей;
- перестройку заголовков ресурсов под локальные идентификаторы.
Основные структуры данных
PerType— набор таблиц на каждый тип ресурса:DKToLocalиLocalToDK— двунаправленное отображение domain/key <-> localId.LocalParent— union-find для ребиндинга локальных id.ServerToLocalиBindInfos— привязки серверных id и их метаданные.PackResources— набор ресурсов, собранных из паков.
Sources— список источников ресурсов (pack, memory, cache).SourceCacheByHash— кэш успешного источника для хеша.PendingReadsByHashиReadyReads— очередь ожидания и готовые ответы.
Источники ресурсов
Источники реализованы через интерфейс IResourceSource:
- pack source (sync) — ищет ресурсы в
PackResources. - memory source (sync) — ищет в
MemoryResourcesByHash. - cache source (async) — делает чтения через
AssetsCacheManager.
Алгоритм поиска:
- Сначала проверяется
SourceCacheByHash(если не протух по поколению). - Источники опрашиваются по порядку, первый
Hitвозвращается сразу. - Если источник вернул
Pending, запрос попадает в ожидание. tickSources()опрашивает асинхронные источники и переводит ответы вReadyReads.
Привязка идентификаторов
getOrCreateLocalId()создаёт локальный id для domain/key.bindServerResource()связывает serverId с localId и записываетBindInfo.unionLocalIds()объединяет локальные id при конфликте, используя union-find.
Ресурспаки
reloadPacks() сканирует директории, собирает ресурсы в PackResources,
а затем возвращает список изменений и потерь по типам.
Важно: ключи ресурсов всегда хранятся с разделителем /.
Для нормализации пути используется fs::path::generic_string().
Заголовки
rebindHeader()заменяет id зависимостей в заголовках ресурса.parseHeader()парсит заголовок без модификаций.
Поток данных чтения
pushReads()принимает списокResourceKeyи пытается получить ресурс.pullReads()возвращает готовые ответы, включая промахи.pushResources()добавляет ресурсы в память и прокидывает их в кэш.
Ограничения
- Класс не предназначен для внешнего многопоточного использования.
- Политика приоритета ресурсов в паке фиксированная: первый найденный ключ побеждает.
- Коллизии хешей не обрабатываются отдельно.