Это зависит от сферы вашей игры. Менеджер активов абсолютно необходим для больших игр, в меньшей степени для небольших игр.
Для больших названий вы должны решить следующие проблемы:
- Общие активы - эта кирпичная текстура используется несколькими моделями?
- Срок действия актива - больше не нужен тот актив, который вы загрузили 15 минут назад? Подсчет ссылок ваших активов, чтобы убедиться, что вы знаете, когда что-то закончено и т. Д.
- В DirectX 9, если загружены определенные типы ресурсов, и ваше графическое устройство «теряется» (это происходит, если вы нажимаете Ctrl + Alt + Del среди прочего) - вашей игре нужно будет воссоздать их
- Загрузка ресурсов до того, как они понадобятся - без этого вы не сможете создать большие игры с открытым миром
- Массовая загрузка ресурсов - мы часто упаковываем множество ресурсов в один файл, чтобы сократить время загрузки - поиск по диску занимает очень много времени
Для небольших изданий такие вещи не так важны, так как в таких средах, как XNA, есть управляющие активами - повторного изобретения нет особого смысла.
Если вам нужен менеджер ресурсов, на самом деле не существует единого решения, подходящего для всех, но я обнаружил, что хэш-карта с ключом в качестве хеша * имени файла (понижено и разделители все «исправлены») хорошо работает для проектов, над которыми я работал.
Обычно не рекомендуется жестко кодировать имена файлов в вашем приложении, обычно лучше, чтобы другой формат данных (например, xml) отображал имена файлов в «идентификаторы».
- Как забавное примечание, вы обычно получаете одно коллизию хешей на проект.
(Попытка избежать обсуждения «не используйте менеджер активов» здесь, так как я считаю это оффтопом.)
Карта ключ / значение - очень удобный подход.
У нас есть одна реализация ResourceManager, в которой фабрики для разных типов ресурсов могут регистрироваться.
Метод "getResource" использует шаблоны, чтобы найти правильную фабрику для требуемого типа ресурса, и возвращает определенный ResourceHandle (снова используя шаблон для возврата SpecificResourceHandle).
Ресурсы пересчитываются ResourceManager (внутри ResourceHandle) и освобождаются, когда они больше не нужны.
Первым дополнением, которое мы написали, был метод «reload (XYZ)», который позволяет нам изменять ресурсы извне работающего движка без изменения кода или перезагрузки игры. (Это важно, когда художники работают на консолях;))
Большую часть времени мы имеем только на экземпляре ResourceManager, но иногда мы создаем новый экземпляр только для уровня или карты. Таким образом, мы можем просто вызвать «shutdown» на levelResourceManager и убедиться, что ничего не течет.
(краткий) пример
источник
Классы Dedicated Manager почти никогда не являются правильным инженерным инструментом. Если вам нужен актив только один раз (например, фон или карта), вы должны запросить его только один раз и позволить ему умереть нормально, когда вы закончите с ним. Если вам нужно кэшировать объект определенного типа, вы должны использовать фабрику, которая сначала проверяет кеш, а затем загружает что-то, помещает его в кеш, а затем возвращает его, и эта фабрика может быть просто статической функцией, обращающейся к статической переменной. , а не своего рода.
Стив Йегге (среди многих, многих других) написал хорошую историю о том, как бесполезные классы менеджеров, благодаря шаблону синглтона, оказываются. http://sites.google.com/site/steveyegge2/singleton-considered-stupid
источник
Я всегда думал, что хороший менеджер активов должен иметь несколько режимов работы. Эти режимы, скорее всего, будут отдельными исходными модулями, придерживающимися общего интерфейса. Два основных режима работы:
Вам понадобится инструмент, который может собрать все оценки из общей базы данных и создать производственный набор данных.
За годы моей работы в качестве разработчика я никогда не видел ничего подобного, хотя я работал только на несколько компаний, поэтому мое мнение не является действительно представительным.
Обновить
ОК, некоторые отрицательные голоса. Я подробно остановлюсь на этом дизайне.
Во-первых, вам не нужны фабричные классы, потому что если у вас есть:
вы знаете тип, так что просто сделайте:
но то, что я пытался сказать выше, это то, что вы в любом случае не будете использовать явные имена файлов, текстура для загрузки будет определяться моделью, в которой используется текстура, так что вам на самом деле не нужно удобочитаемое имя, это может быть 32-разрядное целочисленное значение, которое процессору гораздо проще обрабатывать. Итак, в конструкторе для TextureHandle у вас будет:
AssetStream использует параметр resource_id, чтобы найти местоположение данных. То, как это будет сделано, будет зависеть от среды, в которой вы работаете:
В разработке: поток ищет идентификатор в базе данных (например, с использованием SQL), чтобы получить имя файла, а затем открывает файл, файл может быть кэширован локально или извлечен с сервера, если локальный файл не существует или является устаревший.
В выпуске: поток ищет идентификатор в таблице ключ / значение, чтобы получить смещение / размер в большом упакованном файле (например, в файле WAD в Doom).
источник
Что мне нравится делать с активами, так это настроить единовременного менеджера . Вдохновленные движком Doom, куски - это фрагменты данных, которые содержат ресурсы, хранящиеся в файле кусков, который объявляет имена кусков, длину, тип (растровое изображение, звук, шейдер и т. Д.) И тип содержимого (файл, другой кусочек, внутри сам файл комка). При запуске эти куски вводятся в двоичное дерево, но еще не загружены. Каждая карта (которая также является комом) имеет список зависимостей, которые являются просто названиями комков, с которыми карта должна работать. Эти комки, если они еще не были загружены, загружаются во время загрузки карты. Кроме того, куски соседних карт загружаются, но не одновременно, а по какой-то причине, когда двигатель работает на холостом ходу. Это может сделать карты без шва, и нет экрана загрузки.
Мой метод идеально подходит для карт с открытым миром, но игра, основанная на уровнях, не выиграет от беспроблемности этого метода. Надеюсь это поможет!
источник