Как вы можете поместить все изображения из игры в 1 файл?
Я только что закончил базовую игру RPG, написанную на C ++ SFML, я приложил много усилий в игру, и я бы хотел ее распространять, однако я столкнулся с небольшой проблемой.
Проблема в том, что у меня есть более 200 изображений и файлов карт (они .txt-файлы, содержащие коды карт), все в той же папке, что и исполняемый файл, когда я смотрю в папку, это заставляет меня хотеть плакать немного видя так много ресурсов, я никогда не видел игру, которая показывает вам все ресурсы напрямую, вместо этого я считаю, что они упаковывают ресурсы в определенный файл.
Ну, вот чего я пытаюсь достичь: я надеюсь упаковать все изображения в 1 файл (возможно, также файлы .txt), после чего сможет прочитать из этого файла или легко добавить к нему.
9 ответов
Игровые программисты полагались на один из двух основных способов хранения данных:
- хранить каждый файл данных в виде отдельного файла
- хранить каждый файл данных в формате пользовательского архива
Недостатком первого решения является проблема нехватки дискового пространства, а также проблема более медленных установок.
Второе решение обеспечивает свои собственные ошибки, во-первых, вы должны написать все свое собственное изображение /звук /и т. д. которые используют пользовательский API для доступа к архивированным данным. Еще один недостаток заключается в том, что вам нужно написать свою собственную утилиту архива для создания архивов в первую очередь.
Если вы всегда будете загружать все файлы из архива, TAR /GZ может быть не очень хорошей идеей, потому что вы не можете извлекать определенные файлы по мере необходимости. Именно по этой причине многие игры используют ZIP-архивы, которые позволяют вам извлекать отдельные файлы по мере необходимости (хорошим примером является Quake 3, â € <â € <â € <â € <, где PK3-файлы - это ничего, кроме файлов ZIP с другое расширение).
РЕДАКТИРОВАТЬ: «Скрыть» структуру каталогов игр и «Сохранить» только исполняемые файлы
Другое решение часто используется для «скрытия» игровых файлов в папке состав. Храните только свои исполняемые файлы и, возможно, файл readme в главном и переместите файлы игры в подпапку с именем «данные» или другие связанные.
EDIT: Gamedev Tuts Plus имеют приятный ресурс
EDIT: libarchive
Одно потенциальное решение libarchive, которое представляет собой библиотеку архивирования, которая будет обрабатывать извлечение файлов из архива, таких как ZIP-файл. Он даже позволяет вам назначить извлеченный файл стандартным указателем FILE, что сделает взаимодействие с любыми другими библиотеками потенциально более простым.
EDIT: Файлы формата ZIP с альтернативным расширением
Здесь мне нравится комментарий @Joachim Sauer
Использование файлов формата ZIP с альтернативными расширениями традиция вне игр: Java делает это , OpenDocument Формат (формат a.k.a. OpenOffice /LibreOffice) делает это , даже Office Open XML (a.k.a. «новый» формат Microsoft Office) делает это.
Другим решением, часто используемым для «скрытия» игровых файлов, является структура папок. Храните только свои исполняемые файлы и, возможно, readme в главном каталоге и переместите файлы игры в «данные» подпапки. Я не думаю, что это очень редко. Многие игры, которые я знаю, хранят их контент таким образом.
Мне очень нравится PhysFS . Он позволяет вам получить доступ к папкам или zip-архивам с тем же кодом. Он хорошо работает для всех этапов жизни Игр.
- При разработке : доступ к ресурсам напрямую из иерархии папок. Таким образом, сжатые архивы не мешают, и вы можете быстро выполнять итерацию.
- Начальное развертывание . Запустите свои ресурсы для быстрого развертывания /быстрой установки. Код не нуждается в изменении. Просто укажите PhysFS на zip вместо папки.
- Обновления /Моддинг : PhysFS может загружать несколько архивов zip, где ресурсы от одного переопределяют другой. Обновления могут быть такими же простыми, как новый zip только с измененными файлами. Аналогично для моддинга.
обновление:
Я использовал учебник , включенный в источник, и документацию doxygen , чтобы узнать PhysFS. API действительно довольно прост, вы потратите больше времени на изучение загрузки изображений в SFML через буферы памяти, а не по пути к файлу.
Я бы предложил использовать ZIP-файл. Это вездесущий формат, и вы найдете готовые библиотеки, которые позволяют загружать файлы из ZIP-файла. Быстрый поиск Google даже показал zip-загрузчик для sfml .
Хорошо, вы могли бы обмануть, как они упомянули :) Вы можете сделать спрайт-лист из изображений, в настоящее время нет необходимости его застегивать, если это не спасет тонну пространства. После того, как вы создадите спрайт-лист или несколько спрайтов с изображений, вы можете просто переименовать их расширения. Большинство геймеров не потрудились проверить и почему бы не оставить этот вариант для художников, которые могут захотеть модерировать свою игру в будущем? Таким образом, они могут также создать спрайт-лист, переименовать его расширение и начать катиться.
С текстовыми файлами я смиренно предлагаю вам преобразовать эти данные в двоичную форму. Я уверен, что вы найдете простой способ сделать это. Например, если вы используете только AZ, az и 0-9, вы можете использовать 6 бит для представления каждого символа, который несколько защитит ваш материал, защищенный авторскими правами, он также не позволит другим редактировать карты. Вы всегда можете добавить конвертер карт, если хотите. Однако Zipping вполне разумен для текста.
Речь идет не только о количестве ресурсов или дискового пространства.
С большим количеством различных файлов текстур, когда вы используете SFML, который отображает с OpenGL, каждый раз, когда вы собираетесь отображать текстуру, OpenGL необходимо связать следующую текстуру с видеокартой (проверьте glBindTexture ()), и это действительно дорогостоящая задача.
С учетом этого вы можете понять, почему игры обычно помещают ряд спрайтов в одну и ту же текстуру, так называемые спрайты, в соответствии с вашими меню /уровнями /картами игры.
Результат - огромный прирост производительности, поскольку вы обрабатываете много спрайтов с тем же вызовом текстурной привязки.
Для этого я лично отправил бы путь к пользовательскому двоичному файлу. Это то, что я делаю сам все время, это не так сложно, как могло бы звучать, и это также обеспечивает уровень обфускации для ваших файлов игровых ресурсов. Я написал небольшую вступительную статью Гамедева об этом не так давно, если вам интересно:
Листы спрайтов - это совсем другой предмет, но они являются нормой для большинства игр:)
Другой метод, который вы можете использовать:
Бесплатная версия XnView предоставляет функцию, называемую Strip of Images
" (SHIFT + A), который позволяет создавать sprite-collections
.
Это минимизирует доступ к файлам и особенно важно для веб-приложений /игр, чтобы свести к минимуму количество HTTP-roundtrips
.
Доступ к отдельным изображениям затем предоставляется через карты координат (например, css-определения).
Сначала вы должны написать все свое собственное изображение /звук /и т. д. которые используют пользовательский API для доступа к архивированным данным. Еще один недостаток заключается в том, что вам нужно написать свою собственную утилиту архива для создания архивов в первую очередь. Если вы не будете всегда загружать все файлы из архива, TAR /GZ может быть не очень хорошей идеей, потому что вы не можете извлекать определенные файлы по мере необходимости. Именно по этой причине многие игры используют ZIP-архивы, которые позволяют вам извлекать отдельные файлы по мере необходимости (хорошим примером является Quake 3, â € <â € <â € <â € <, где PK3-файлы - это ничего, кроме файлов ZIP с другое расширение). http://zpp-library.sourceforge.net/