Як ви можете помістити всі зображення з гри в 1 файл?


67

Щойно я закінчив основну гру RPG, написану на C ++ SFML, я вклав багато зусиль у гру і хотів би поширити її, проте я зіткнувся з невеликою проблемою.

Проблема полягає в тому, що у мене є понад 200 зображень і файлів карт (вони .txt-файли, які містять коди карт), все в тій же папці, що і виконуваний файл, коли я дивлюся в папку, це змушує мене трохи поплакати, побачивши так багато ресурсів, я ніколи не бачив гри, яка показує вам усі ресурси безпосередньо, натомість я вважаю, що вони запакують ресурси у певний файл.

Ну, саме цього я намагаюся досягти: сподіваюся спакувати всі зображення в 1 файл (можливо, також .txt файли), а потім зможу прочитати з цього файлу або легко додати до нього.



Я бачив код, де всі зображення були упаковані в рядок у коді. Але це було зроблено завдяки вимогам. (Це був конкурс Java на 64 Кб)
Омар Кохеджі

Вибачте, що це змагання з Java на 4 Кб. Не 64 Кбіт.
Омар Кухеджі

Відповіді:


62

Ігрові програмісти покладаються на один із двох основних методів зберігання даних:

  • зберігати кожен файл даних як окремий файл
  • зберігати кожен файл даних у власному форматі архіву

Недоліком першого рішення є проблема витраченого місця на диску, а також проблема повільніших установок.

Друге рішення передбачає власні підводні камені, по-перше, ви повинні написати все своє зображення / звук / тощо. завантаження процедур, які використовують користувацький API для доступу до архівованих даних. Наступним недоліком є ​​те, що вам потрібно написати власну архівну утиліту, щоб створити архіви в першу чергу.

Якщо ви завжди завантажуєте всі файли з архіву, TAR / GZ може бути не дуже хорошою ідеєю, оскільки ви не можете витягти конкретні файли у міру необхідності. З цієї причини багато ігор використовують архіви ZIP, які дозволяють витягувати окремі файли за потребою (хороший приклад - Quake 3, файли PK3 - це не що інше, як ZIP-файли з іншим розширенням).

EDIT: "Сховати" структуру папки ігор та "Keep" лише виконувані файли

Інше рішення часто використовується для "приховування" ігрових файлів у структурі папок. Зберігайте лише свої виконувані файли та, можливо, файл readme у головному каталозі та переміщуйте ігрові файли у підпапку з назвою "дані" чи інші пов'язані з цим.

EDIT: Gamedev Tuts Plus мають хороший ресурс

EDIT: лібрхів

Одне потенційне бібліотечне рішення - це бібліотека архівації, яка буде обробляти вилучення файлів з архіву, наприклад, ZIP-файл. Це навіть дозволяє призначити витягнутий файл стандартному покажчику FILE, що зробило б взаємодії з будь-якими іншими бібліотеками потенційно більш простими.

EDIT: Файли ZIP-формату з альтернативним розширенням

Тут мені подобається коментар @Joachim Sauer

Використання файлів ZIP-формату з альтернативними розширеннями також має велику традицію поза межами ігор: Java це робить , формат OpenDocument (він же формат OpenOffice / LibreOffice) , навіть Office Open XML (він же "новий" формат Microsoft Office) робить це .


2
Так, Thief / SystemShock2 використовували .zip файли теж перейменовані на щось інше. У Java ви можете використовувати щось на зразок TrueZip для доступу до файлів у блискавках, як якщо б вони були файлами у папках, я думаю, є подібні бібліотеки для C ++.
Нік

18
Використання файлів ZIP-формату з альтернативними розширеннями також має велику традицію поза межами ігор: Java це робить , формат OpenDocument (він же формат OpenOffice / LibreOffice) , навіть Office Open XML (він же "новий" формат Microsoft Office) робить це , ...
Йоахім Зауер

5
@Svish. Залежно від платформи, обсяг дискового простору, який займає багато невеликих файлів, може бути значно більшим, ніж обсяг, який займає один великий файл, навіть якщо цей великий файл зовсім не стискається ( .tarнаприклад,). Це пов'язано з тим, як фізично зберігаються дані на диску.
TRiG

1
Ах, це правда. Не повинно бути багато, якщо їх не багато , але в цьому випадку вона справді може нароститися. Я можу уявити, що встановлення та видалення також сприймає багато невеликих файлів.
Свиш

2
Трохи пов’язаний з коментарем Kylotan, ось допис Джонатана Удар на деві -блозі Свідка про використання архівів та те, як вони взаємодіють із механізмом виправлення Steam. "Свідок запакує більшість своїх даних у один 2-гігабайтний файл, що зберігається у форматі .zip. Перш ніж завантажувати початкову версію в Steam, я взяв запобіжний захист, щоб мінімізувати розміри патчів, або так я подумав [...] (Уявіть собі що файли зберігаються у випадковому порядку: напевно, кожен патч передбачає, що кожен гравець повторно завантажує всю гру!) "
Ерік,

39

Ще одне рішення, яке часто використовується для «приховування» ігрових файлів, - це структура папок. Зберігайте в головному каталозі лише свої виконувані файли та, можливо, ридмейми та переміщуйте файли гри в підпапку "дані". Я не думаю, що це дуже рідко. Багато ігор, які я знаю, зберігають їхній вміст таким чином.


8
+1 Якщо місця на диску чи захист не викликає проблем, це найлегше виправити.
Лоран Кувіду,

1
+1, тому що інший хлопець сказав +1. Не можу помилитися, так? (Жарти вбік, чудова відповідь.)
jcora

Це, на мій погляд, ідеальний вибір. Якщо файлова система не може впоратися з цим ефективно, файлова система порушена, і ви повинні спертися на виробник ОС, щоб вдосконалити її.
всезначний

3
@Omnifarious Це не завжди так, наприклад, при читанні з оптичного диска, навіть із ідеальною файловою системою, звичайно пакувати файли в завантаження, щоб запобігти надмірному пошуку (швидкість насправді може бути дуже дивною). Але це зовсім інша історія для жорстких дисків, і я схильний вважати, що ОП в цьому випадку.
Лоран Кувіду,

3
@ Mr.Beast Ви пропустили мою думку. Я говорю про оптичні диски. Я працював у студії, де це була робота повного робочого дня одного програміста, щоб переконатися, що файли будуть упаковані максимально ефективно на DVD, щоб отримати найкращий час завантаження. Я впевнений, що він буде радий дізнатися, що він міг просто покластися на файлову систему DVD;)
Лоран Кувіду,

22

Мені дуже подобається PhysFS за це. Це дозволяє отримувати доступ до папок або поштових архівів з тим самим кодом. Він добре працює на всіх етапах життя Ігор.

  1. Під час розробки : отримуйте доступ до ресурсів безпосередньо з ієрархії папок. Таким чином, стислі архіви не заважають, і ви можете швидко повторити.
  2. Початкове розгортання : збирайте свої ресурси для легкого розгортання / швидкої установки. Не потрібно змінювати код. Просто наведіть PhysFS на zip замість папки.
  3. Оновлення / Модифікація : PhysFS може завантажувати кілька архівів zip, де ресурси переважають інші. Оновлення можуть бути такими ж простими, як і новий поштовий індекс, лише із зміненими файлами. Аналогічно для модінгу.

оновлення:

Я використовував підручник, включений до джерела та документації на доксиген, щоб вивчити PhysFS. API справді досить простий, ви витратите більше часу на те, як завантажувати зображення в SFML за допомогою буферів пам'яті, а не шляхом файлу.


4
Я використовую PhysFS для свого поточного проекту і мені це подобається. Мені не завжди потрібно відновлювати мій файл архіву вмісту; Я можу просто опустити оновлену версію на шляху пошуку та BAM! Це працює.
Zack The Human

Після деяких відповідей я вирішив піти з physFS. Ви б порекомендували порекомендувати приємний підручник? :)
Багстер

12

Я б запропонував використовувати файл ZIP. Це повсюдний формат, і ви знайдете готові бібліотеки, які дозволяють завантажувати файли з ZIP-файлу. Швидкий пошук Google навіть виявив завантажувач zip для sfml .


3

Ну, ви можете обдурити, як вони згадували :) Ви можете зробити спрайтовий аркуш із зображень, зараз немає потреби закопувати його, якщо це не заощадить багато тонни місця. Створивши спрайт-лист або кілька спрайтових аркушів із зображень, ви можете просто перейменувати їх розширення. Більшість геймерів не будуть намагатися перевірити, а чому б не залишити цю опцію артистам, які, можливо, захочуть модифікувати вашу гру в майбутньому? Таким чином вони також можуть створити спрайт-аркуш, перейменувати його розширення та почати прокат.

За допомогою текстових файлів я покірно пропоную вам перетворити ці дані у двійкову форму. Я впевнений, що ви знайдете простий спосіб зробити це. Наприклад, якщо ви використовуєте лише AZ, az та 0-9, ви можете використовувати 6 біт для представлення кожного символу, що дещо захистить ваш захищений авторським правом матеріал, це також не дозволить іншим редагувати карти. Ви завжди можете додати конвертер карт, якщо хочете. Хоча для блискавок текст цілком розумний.


Перетворення на бінарне є корисною порадою, але не для захисту - просто простіше буде розбирати та швидше завантажуватись. Запропонував би це як етап попередньої обробки, але це буде поза темою для питання.
Максим Мінімус

Ну, я здогадуюсь, якщо він хоче захистити його більш ефективно, він може спробувати зашифрувати його в RSA або подібному алгоритмі (немає необхідності). Я сумніваюсь, хтось несанкціоновано використовуватиме файли карт із інді-гри, якщо вона знаходиться у бінарному файлі. Це, здається, не варто вкладати час у з'ясування нашого розбору. Текстові файли просто повністю вразливі і, як ви запропонували щось неефективне для зберігання даних.
вовкдаун

3
На жорстких дисках завантаження одного zip-файлу відбувається швидше, ніж велика кількість невеликих файлів, оскільки на фізичний диск є менш дорогі випадкові пошуки. Двійковий файл для невеликої гри можна зіставити в пам'ять і працювати «магічно», майже не потрібно розбирати.
Ліосан

@Liosan Ви могли неправильно трактувати те, що я мав на увазі, або я вас неправильно зрозумів .. Я сказав, що бінарний файл краще для зберігання даних і що інші дизайнери ігор навряд чи захочуть навчитися розбирати ваш код бінарної карти, якщо це не задокументовано та не рекомендується для модифікації цілей. Тому він пропонує деякий рудиментарний захист над текстовими файлами.
вовкдаун

2

Йдеться не лише про кількість ресурсів чи місця на диску.
З багатьма різними файлами текстур, як ви використовуєте SFML, який надає OpenGL, кожен раз, коли ви збираєтеся надати текстуру, OpenGL потрібно прив’язувати наступну текстуру до відеокарти (перевірте glBindTexture ()), і це дійсно дороге завдання.
Зважаючи на це, ви можете зрозуміти, чому ігри зазвичай містять кілька спрайтів у тій же текстурі, так званих спрайтах, відповідно до ваших меню / рівнів / карт гри.
Результат - величезний приріст продуктивності, оскільки ви надаєте багато спрайтів з однаковим викликом прив'язки текстури.


Отримавши декілька посилань на створення спрайта, я розглядав деякі рефактори, щоб зменшити кількість зображень. Спасибі
Багстер

2

Я б особисто відправив для цього спеціальний маршрут бінарних файлів. Це те, що я роблю сам увесь час зараз, це не так складно, як це може здатися, і це також забезпечує рівень затуплення для ваших ігрових ресурсних файлів. Я написав невеличку вступну статтю Гамедева про це не так давно, якщо вас цікавить:

http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/

Спрайти - це зовсім інша тема, але вони є нормою для більшості ігор :)


1

Ще один метод, який ви можете використовувати:

Безкоштовна версія XnView надає функцію під назвою " Strip of Images" (SHIFT + A), яка дозволяє створюватиsprite-collections .

Це мінімізує доступ до файлів і особливо важливо для веб-додатків / ігор, щоб мінімізувати кількість HTTP-roundtrips .

Потім доступ до окремих зображень надається через координатні карти (наприклад, визначення css).


0

Спочатку ви повинні написати все своє зображення / звук / тощо. завантаження процедур, які використовують користувацький API для доступу до архівованих даних. Наступним недоліком є ​​те, що вам потрібно написати власну архівну утиліту, щоб створити архіви в першу чергу. Якщо ви завжди завантажуєте всі файли з архіву, TAR / GZ може бути не дуже хорошою ідеєю, оскільки ви не можете витягти конкретні файли у міру необхідності. З цієї причини багато ігор використовують архіви ZIP, які дозволяють витягувати окремі файли за потребою (хороший приклад - Quake 3, файли PK3 - це не що інше, як ZIP-файли з іншим розширенням). http://zpp-library.sourceforge.net/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.