Какие есть готовые менеджеры ресурсов/ассетов/зависимостей с открытым исходным кодом для игр? Какие есть книги/статьи/видео, по реализации таковых?
Есть такая часть игры - менеджер ресурсов/ассетов/зависимостей, короче - модуль (в архитектурном смысле), отвечающий за загрузку/выгрузку различного игрового контента (графика, аудио, тексты и т.д. и т.п.).
Соответственно, закономерно, что такой модуль люди писали и не один раз. Следовательно:
- Должны быть готовые - в т.ч. open source - реализации.
- Должны быть книги/статьи/видео на тему того, как написать таковой.
Поскольку под это определение попадает куча всего, вплоть до банального контейнер/коллекция + методы загрузки из файла и возврата указателя/ссылки (в зависимости от ЯП), уточню, что интересует меня:
- Сканирование файлов и папок (чтобы можно было прописать несколько путей в каком-нибудь конфигурационном файле, а менеджер по этим путям отыскал всё необходимое и предложил загрузить по именам, которые как-нибудь подобрал на основе, какой-либо системы правил и имён файлов).
- Умение работать с архивами/бинарями содержащими друг за другом необходимые файлы (т.е. на вход - файл(ы) - ахив(ы)/бинарь(и), на выход - графика, аудио, тексты и т.п.)
- Умение подгружать обновившиеся зависимости "на горячую" (например, я отредактировал текстовый файл и менеджер перегрузил соответствующий текст)
- Предзагрузка (до того, как файл потребуется его должно быть возможно загрузить заранее)
- Разделяемые ресурсы с подсчётом ссылок на них (т.е. если данные загружены из файла, то, по умолчанию, они могут быть выгружены, когда на них перестанут ссылаться - если не указано иное).
- Учёт различных свойств ресурсов: размер в памяти, как часто к нему обращаются, как долго используют и т.д. и т.п. должен учитываться менеджером при ответе на вопрос: выгрузить зависимость или оставить её в памяти (при условии, что количество ссылок на неё = 0).
- Умение получать данные не только из файловой системы (файлов), но и из других источников - как минимум - из базы данных.
- Умение работать с разными зависимостями: т.е. грубо говоря, через интерфейс ресурса, я должен буду определять как загружать/выгружать нужные мне ресурсы, а менеджер будет работать с теми реализациями этого интерфейса, которые скормлю ему я.
В общем, хотел бы что-то такое (пример на C++, но ЯП - в данном случае мне пофиг):
cool_dependency_manager::DependencyManager mgr("config.cfg"); //может быть xml, json, properties и т.д. - вообще пофиг
game::Hero hero(mgr); // Конструируем героя, а ресурсы он берёт из DependencyManager-а, который как-то где-то их берёт сам - его проблемы. Где-то в недрах, конструктор Hero вызывает mgr.get("VeryCoolStuff") - ресурс который нужен для конструирования героя.
Оно же на Java/C#:
cool_dependency_manager.DependencyManager mgr = new cool_dependency_manager.DependencyManager("config.cfg"); //может быть xml, json, properties и т.д. - вообще пофиг
game.Hero hero = new game.Hero(mgr);// Конструируем героя, а ресурсы он берёт из DependencyManager-а, который как-то где-то их берёт сам - его проблемы. Где-то в недрах, конструктор Hero вызывает mgr.get("VeryCoolStuff") - ресурс который нужен для конструирования героя.
В общем, суть, думаю ясна: какая-то штука, которая умеет притаскивать произвольный (определённый её пользователем - мной) медиаконтент (он же -"ассеты"/"ресурсы"/"зависимости") в приложение, абстрагируя от таких вещей как файловая система, база данных и т.д. и т.п., а лишь опираясь на некоторый конфиг, следить за актуальностью загруженного, загружать и выгружать всё это при необходимости.
- Какие есть реализации подобных систем с открытым исходным кодом?
- Какие есть книги/статьи/видео на данную тему?