Менеджеры ресурсов - они хороши?


20

Я много раз видел в исходном коде подобные вещи [ну, это скорее моя псевдо-идея на C ++]

typedef shared_ptr<Resource> ResourcePtr;// for ease  
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");  
sound1->Play();  
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");

Мне было просто интересно, насколько полезен такой класс, как этот:

  • Загруженные медиа-файлы
  • Хранят их в памяти
  • Сделал это в начале уровня - экран загрузки.
  • Убрано

Вместо того, чтобы иметь систему:

  • Ресурсы принадлежат только юридическим лицам или свободны.
  • Отвечает за собственную загрузку в память.

Первый - это «менеджер» как таковой; что-то, что я чувствую, указывает на то, что это неправильно. Тем не менее, он позволяет передавать что-то вроде вектора имен ресурсов, вместо того, чтобы копаться в поиске всего, что нужно загрузить.



1
Не совсем. Я думаю, что это правильный вопрос.
Рикет

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

Я не думаю, что спрашиваю то же самое. Кажется, это вопрос о том, нужно ли вам использовать какой-либо инструмент для сокращения пути к файлу, тогда как я спрашиваю о том, что такое загрузчик ресурсов / тип кэша. Тем не менее, я думаю, что это не появилось в поиске, так как я использовал ресурс, а не актив.
Коммунистическая утка

2
@ Брайан, я не согласен, «являются ли управляющие активами хорошей идеей» - это другой вопрос, чем «как вы реализуете управляющих активами». Конечно, некоторые люди пытались ответить на первый вопрос на второй вопрос, что может привести к частичному совпадению ответов.
Тетрад

Ответы:


20

Хороший менеджер ресурсов - ключ к тому, насколько хорошо - и насколько гибким будет ваш движок игры.

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

Если система ресурсов хорошо абстрагирована, базовые детали могут настороженно относиться к файловой системе, хранилищу физических файлов и даже к ...

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

Не нужно беспокоиться об идентификаторах ресурсов и тому подобном.

Дублирующая обработка конфликта ресурсов и т. Д.

Позвольте менеджеру ресурсов разобраться с этим.

В зависимости от того, как вы его спроектируете - если C ++, то подружитесь с вашим классом (ами) управления сценой, чтобы обеспечить правильную обработку владения.

Ресурсный пул?

Нет проблем.

Забыть освободить ресурсы?

Нет проблем.

Одинаковый интерфейс для ресурсов, где бы они ни находились: память, диск, архив, сеть.

Нет проблем.

Вы хотите потоковую передачу?

Threading?

Пусть ваш центр управления ресурсами позаботится об этом.

И вы можете быть уверены, что он сообщит вам, когда ресурсы будут готовы к использованию.

В Ogre 3D очень гибкая система управления ресурсами, но я уверен, что есть и другие.


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

13

Я недавно написал менеджер ресурсов, который работает довольно хорошо для моего случая. Основные характеристики:

  • Ресурсы запрашиваются по строковому идентификатору, например ResourceManager::instance().getTexture("textures/player.png"),. Идентификатор текстуры в настоящее время сопоставляется непосредственно с файлом на диске, что удобно во время разработки, но позже оно будет заменено поиском в некотором архиве.

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

  • Вышеуказанный вызов не возвращает Textureобъект, а скорее Resource<Texture>объект; Ожидается, что вызывающая сторона будет хранить Resource<Texture>объект, а не фактическую текстуру. Resource<Texture>Действует как смарт - указатель на объект Texture; его operator*()возвращает сам Textureобъект. Преимущество заключается в том, что фактическая текстура может быть перезагружена или выгружена без необходимости обновления всех клиентов.

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

  • Ресурсы могут зависеть друг от друга. Большинство, если не все, ресурсы зависят от Fileресурса, который является файлом, из которого они были загружены. Если, например, модель зависит от текстуры, она будет перезагружаться всякий раз, когда файл текстуры изменяется на диске.

  • Когда ресурс не может быть найден или не загружается, ресурс по умолчанию заменяется без вывода сообщений. Это позволяет мне использовать ресурсы, которые я еще не создал, без сбоев в игре. (Запланированная функция: укажите «основные» ресурсы, такие как шейдеры GPGPU, без которых игра вообще не может нормально работать.)

  • Подсчет ссылок и выгрузка неиспользуемых ресурсов могут быть легко добавлены. Так как моя игра довольно маленькая, у меня еще не было потребности в этом.

Я думаю, что этот список функций показывает, что да, менеджеры ресурсов могут быть хорошими!


2

Одной из причин наличия менеджера ресурсов является совместное использование ресурсов. Например, когда вы вызываете resourceManager.Get("sprite.png"), если «sprite.png» уже загружен, менеджер ресурсов может просто вернуть указатель на уже загруженный ресурс спрайта, а не создавать новое изображение и перезагружать его с диска.

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

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


1

Другое преимущество, помимо кэширования и подсчета ссылок, заключается в том, что он может обрабатывать зависимости (смоделировать текстуру потребностей b? Я получу ее для вас!) И вопросы порядка загрузки (модели необходимо знать, какой шейдер b требуется? Позвольте мне загрузить шейдер б перед загрузкой модели!)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.