Я много раз видел в исходном коде подобные вещи [ну, это скорее моя псевдо-идея на C ++]
typedef shared_ptr<Resource> ResourcePtr;// for ease
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");
sound1->Play();
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");
Мне было просто интересно, насколько полезен такой класс, как этот:
- Загруженные медиа-файлы
- Хранят их в памяти
- Сделал это в начале уровня - экран загрузки.
- Убрано
Вместо того, чтобы иметь систему:
- Ресурсы принадлежат только юридическим лицам или свободны.
- Отвечает за собственную загрузку в память.
Первый - это «менеджер» как таковой; что-то, что я чувствую, указывает на то, что это неправильно. Тем не менее, он позволяет передавать что-то вроде вектора имен ресурсов, вместо того, чтобы копаться в поиске всего, что нужно загрузить.
architecture
assets
Коммунистическая утка
источник
источник
Ответы:
Хороший менеджер ресурсов - ключ к тому, насколько хорошо - и насколько гибким будет ваш движок игры.
Это не только решает множество проблем с низкоуровневым управлением ресурсами, но также помогает гарантировать, что ресурсы загружаются только один раз, а затем используются повторно, если они уже загружены.
Если система ресурсов хорошо абстрагирована, базовые детали могут настороженно относиться к файловой системе, хранилищу физических файлов и даже к ...
Вы просто запрашиваете ресурс, и он вам предоставляется.
Не нужно беспокоиться об идентификаторах ресурсов и тому подобном.
Дублирующая обработка конфликта ресурсов и т. Д.
Позвольте менеджеру ресурсов разобраться с этим.
В зависимости от того, как вы его спроектируете - если C ++, то подружитесь с вашим классом (ами) управления сценой, чтобы обеспечить правильную обработку владения.
Ресурсный пул?
Нет проблем.
Забыть освободить ресурсы?
Нет проблем.
Одинаковый интерфейс для ресурсов, где бы они ни находились: память, диск, архив, сеть.
Нет проблем.
Вы хотите потоковую передачу?
Threading?
Пусть ваш центр управления ресурсами позаботится об этом.
И вы можете быть уверены, что он сообщит вам, когда ресурсы будут готовы к использованию.
В Ogre 3D очень гибкая система управления ресурсами, но я уверен, что есть и другие.
источник
Я недавно написал менеджер ресурсов, который работает довольно хорошо для моего случая. Основные характеристики:
Ресурсы запрашиваются по строковому идентификатору, например
ResourceManager::instance().getTexture("textures/player.png")
,. Идентификатор текстуры в настоящее время сопоставляется непосредственно с файлом на диске, что удобно во время разработки, но позже оно будет заменено поиском в некотором архиве.Менеджер ресурсов хранит карту идентификаторов ресурсов, поэтому он не будет перезагружать ресурс, который уже был загружен.
Вышеуказанный вызов не возвращает
Texture
объект, а скорееResource<Texture>
объект; Ожидается, что вызывающая сторона будет хранитьResource<Texture>
объект, а не фактическую текстуру.Resource<Texture>
Действует как смарт - указатель на объектTexture
; егоoperator*()
возвращает самTexture
объект. Преимущество заключается в том, что фактическая текстура может быть перезагружена или выгружена без необходимости обновления всех клиентов.Менеджер ресурсов периодически проверяет, изменились ли файлы на диске, и при необходимости перезагружает их. Это позволяет мне изменять текстуры или шейдеры и видеть результат, даже не перезапуская игру.
Ресурсы могут зависеть друг от друга. Большинство, если не все, ресурсы зависят от
File
ресурса, который является файлом, из которого они были загружены. Если, например, модель зависит от текстуры, она будет перезагружаться всякий раз, когда файл текстуры изменяется на диске.Когда ресурс не может быть найден или не загружается, ресурс по умолчанию заменяется без вывода сообщений. Это позволяет мне использовать ресурсы, которые я еще не создал, без сбоев в игре. (Запланированная функция: укажите «основные» ресурсы, такие как шейдеры GPGPU, без которых игра вообще не может нормально работать.)
Подсчет ссылок и выгрузка неиспользуемых ресурсов могут быть легко добавлены. Так как моя игра довольно маленькая, у меня еще не было потребности в этом.
Я думаю, что этот список функций показывает, что да, менеджеры ресурсов могут быть хорошими!
источник
Одной из причин наличия менеджера ресурсов является совместное использование ресурсов. Например, когда вы вызываете
resourceManager.Get("sprite.png")
, если «sprite.png» уже загружен, менеджер ресурсов может просто вернуть указатель на уже загруженный ресурс спрайта, а не создавать новое изображение и перезагружать его с диска.Менеджер ресурсов также может кэшировать ресурсы, так что, хотя последняя ссылка на ресурс была отброшена, менеджер ресурсов может сохранить его в памяти на случай, если он снова загрузится в ближайшем будущем. Менеджер ресурсов будет запрограммирован на автоматическое управление всеми ресурсами памяти с вашими ресурсами.
Наконец, я думаю, что очень полезная функция - это перезагрузка ресурсов в игре. Поскольку диспетчер ресурсов хранит дескрипторы всех игровых ресурсов, вы можете встроить функцию, которая заставляет перезагружать все ресурсы с диска и обновлять игру в режиме реального времени, что чрезвычайно полезно для художников / дизайнеров, работающих с вашей игрой. ,
источник
Другое преимущество, помимо кэширования и подсчета ссылок, заключается в том, что он может обрабатывать зависимости (смоделировать текстуру потребностей b? Я получу ее для вас!) И вопросы порядка загрузки (модели необходимо знать, какой шейдер b требуется? Позвольте мне загрузить шейдер б перед загрузкой модели!)
источник