Объединение ресурсов в один двоичный файл - PullRequest
3 голосов
/ 15 октября 2008

Как объединить несколько ресурсов для приложения (изображения, звуки, сценарии, xmls и т. Д.) В один / несколько двоичных файлов, чтобы они были защищены от рук пользователя? Каковы типичные шаги (организация, загрузка, шифрование и т. Д.)?

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

Ответы [ 5 ]

3 голосов
/ 16 октября 2008

Есть много способов сделать это. У m_pGladiator есть несколько хороших идей, особенно с разделением. Я хотел бы сделать несколько других комментариев.

Во-первых, если вы собираетесь упаковать кучу ресурсов в один файл (я называю эти пакетные файлы), то я думаю, что вам следует поработать, чтобы избежать загрузки всего файла и последующей десерализации из этого файла в память. Простая причина в том, что это больше памяти. Я полагаю, что это не проблема для ПК, но это хорошая практика, и это важно при работе на консоли. Хотя мы (в настоящее время) не сериализуем объекты, как предложил m_pGladiator, мы движемся к этому.

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

  1. Аудио-файл может содержать все аудио для вашей игры. Вам может потребоваться загрузить только определенные виды аудио для меню или экранов интерфейса и разные наборы аудио для уровней. Это может попасть в первую категорию выше.
  2. Типом, который попадает во вторую категорию, могут быть все модели / текстуры / и т. Д. Для уровня. В основном вы хотите загрузить все содержимое этого файла в игру во время загрузки, потому что вам (вероятно) понадобится все его содержимое, пока игрок играет на этом уровне или в разделе.

многие из упакованных нами файлов попадают во вторую категорию. Мы в основном упаковываем содержимое уровня, а затем сжимаем их чем-то вроде zlib. Когда мы загружаем один из них во время игры, мы читаем небольшой объем файла, распаковываем то, что прочитали, в буфер памяти, а затем повторяем, пока весь файл не будет считан в память. Буфер, в который мы читаем, является относительно небольшим, в то время как буфер конечного назначения достаточно велик, чтобы вместить самый большой набор несжатых данных, которые нам нужны. Этот метод сложен, но, опять же, он экономит ОЗУ, это интересное упражнение, чтобы начать работать, и вы чувствуете себя хорошо и тепло внутри, потому что вы хорошо управляете системными ресурсами. как только пакетный файл полностью распакован в его буфер назначения, мы запускаем последний проход в буфере, чтобы исправить расположение указателей и т. д. Этот метод работает, только когда вы записываете свой пакетный файл как структуры, известные игре. Другими словами, наши инструменты для написания файлов Packfile разделяют структуру (или классы) с кодом игры. Мы в основном пишем и сжимаем точные представления структур данных.

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

Но опять же, я хочу подчеркнуть, что если вы идете по маршруту, подобному I или m_pGladiator, я бы усердно работал, чтобы не загружать весь файл в ОЗУ, а затем десериализовать в другое место в ОЗУ. Это пустая трата ресурсов (которых у вас, возможно, много). Я бы сказал, что вы можете сделать это, чтобы он заработал, а затем, как только он заработает, вы можете работать с методом, который одновременно читает только часть файла, а затем распаковывает его в целевой буфер. Вы должны использовать схему comprsesion, которая будет работать так же. zlib и lzw оба делают (я верю). Я не уверен насчет алгоритма MD5.

Надеюсь, что это поможет.

2 голосов
/ 15 октября 2008

сделать как Java: упаковать все в zip и использовать API-интерфейс, похожий на файловую систему, чтобы читать прямо оттуда.

0 голосов
/ 16 марта 2011

Для будущих людей, таких как я, которые интересуются этой же темой, просмотрите две следующие ссылки:

http://www.sfml -dev.org / вики / EN / учебники / formatdat

http://archive.gamedev.net/reference/programming/features/pak/

0 голосов
/ 15 октября 2008

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

  1. Прежде всего прочитайте о сериализации объектов . Когда вы загружаете ресурс из файла (графический, звуковой или любой другой), он сохраняется в некотором экземпляре объекта в памяти. В игре обычно используются десятки графических и звуковых объектов. Вы должны сделать инструмент, который загружает их все и сохраняет их в коллекции в памяти. Затем сериализуйте эти коллекции в двоичный файл, и у вас есть все ресурсы.

  2. Затем вы можете использовать, например, MD5 или любой другой алгоритм шифрования для шифрования этого файла.

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

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

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

0 голосов
/ 15 октября 2008

Краткий ответ: да.

В Mac OS 6,7,8 существовал API, предназначенный именно для этой задачи. Поиск "Диспетчер ресурсов", если вы заинтересованы. Изменить: То же самое делает ROOT пакет анализа физики.

Не то чтобы я знал о хорошем инструменте прямо сейчас. На какой платформе (ах) вы хотите, чтобы она работала?


Отредактировано, чтобы добавить: Все два-три инструмента этого сорта, которые у меня нет, похожи друг на друга:

  • Файл начинается с заголовка и индекса
  • Существует ряд блоков, некоторые из которых могут иметь собственные заголовки и указатели, некоторые из которых являются листами
  • Каждый лист представляет собой простую сериализацию данных, которые будут сохранены.
  • Весь файл (или иногда отдельные блоки) может быть сжат.

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

...