Зачем использовать файлы манифеста актива?

Иногда вы увидите, что люди рекомендуют это вместо использования графических /звуковых файлов и т. д. как это ...

// Game code
Image myImage = new Image("path/to/image.png");

... вы должны использовать файл manifest в качестве уровня косвенности:

// Manifest file
MY_IMAGE: path/to/image.png

// Game code
Manifest myManifest = new Manifest("path/to/manifest");
Image myImage = myManifest.getImage("MY_IMAGE");

Какие причины я бы хотел использовать для такого подхода? Если я не использую скомпилированный язык, будут ли еще причины для этого?

10 голосов | спросил Tung Nguyen 25 J000000Sunday10 2010, 10:58:29

5 ответов


7

В большинстве случаев файлы манифеста связаны с каким-то форматом архивного файла. Например, JAR-файл в java - это просто zip-файл с файлом манифеста, который перечисляет активы в zip-файле и где их искать. В этом случае «путь /to /image.png» не является реальным путем файловой системы, а представляет собой информацию о том, как найти объект в сжатом архиве. В дополнение к преимуществам сжатия в дисковых пространствах использование файлового архива может повысить производительность, поскольку в Windows очень сложно использовать десятки тысяч отдельных файлов в небольшом количестве каталогов.

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

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

ответил Ben Zeigler 25 J000000Sunday10 2010, 11:38:18
4

Одна из причин: программирование, управляемое данными.

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

<material name="wood">
  <diffuse color="1,1,1,1">environment.zip/wood_diffuse.jpg</diffuse>
  <normals>environment.zip/wood_normals.jpg</normals>
  <shader>environment.zip/wood.fx</shader>
  <specular color="1,1,1,1" power="0.5" flat="yes" />
</material>
ответил Nick Bedford 26 J000000Monday10 2010, 03:23:55
2

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

Большое преимущество проявлений заключается в том, что они действуют как индекс для большого количества данных в одном компактном месте. Таким образом, они повышают производительность (потому что вы можете просто загрузить весь манифест с диска и сохранить его в памяти), особенно в случае, когда вам нужно перебирать несколько объектов, , но вы заранее не знаете, что эти объекты будет . Если объекты находятся на диске, особенно если они находятся в нескольких местах, вам нужно прикоснуться к файловой системе каждый раз, когда вы хотите перебирать файлы. Для файловых систем на дисках время, необходимое для прикосновения к файловой системе, является непомерно высоким, поэтому итерация по файлам в каталоге является огромной стоимостью. Предварительно создавая манифест файлов во время сборки (NB: не время компиляции), вы тратите эту стоимость на использование памяти.

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

ответил MrCranky 26 J000000Monday10 2010, 14:26:02
1

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

ответил Dennis Munsie 25 J000000Sunday10 2010, 19:24:28
0

Файлы манифеста обеспечивают слой косвенности между именем ресурса и его местоположением. Ofter дополнительные слои косвенности - всего лишь знак над дизайном. Однако иногда этот дополнительный уровень просто необходим для создания элегантного и эффективного решения.

Вот простой конкретный пример, где мне помогло расположение ресурсов /разделение. В процессе разработки мои художественные активы находятся в контроле версий с исходным кодом. Это очень удобно и позволяет быстро итеративно. Обычно имя ресурса отражает его местоположение. Показатель развития очень прост.

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

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

ответил deft_code 25 J000000Sunday10 2010, 19:27:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132