Jak umieścić wszystkie obrazy z gry w jednym pliku?

67

Właśnie skończyłem podstawową grę RPG napisaną w C ++ SFML, włożyłem wiele wysiłku w tę grę i chciałbym ją rozpowszechniać, jednak natknąłem się na mały problem.

Problem w tym, że mam ponad 200 obrazów i plików map (są to pliki .txt, które przechowują kody map) wszystkie w tym samym folderze co plik wykonywalny, kiedy patrzę w folder, sprawia, że ​​chce mi się trochę płakać tak wielu zasobów, nigdy nie widziałem gry, która pokazuje wszystkie zasoby bezpośrednio, zamiast tego uważam, że pakują zasoby w określony plik.

Cóż, właśnie to staram się osiągnąć: mam nadzieję, że spakuję wszystkie obrazy w jednym pliku (być może również pliki .txt), a następnie będę mógł odczytać z tego pliku lub łatwo go dodać.

Bugster
źródło
Widziałem kod, w którym wszystkie obrazy były spakowane w ciąg znaków w kodzie. Ale zostało to zrobione ze względu na wymagania. (Był to konkurs Java 64
KB
Przepraszam, to był konkurs java 4Kb. Nie 64Kb.
Omar Kooheji,

Odpowiedzi:

62

Programiści gier polegali na jednej z dwóch głównych metod przechowywania danych:

  • przechowuj każdy plik danych jako osobny plik
  • przechowuj każdy plik danych w niestandardowym formacie archiwum

Wadą pierwszego rozwiązania jest problem zmarnowanego miejsca na dysku, a także problem wolniejszych instalacji.

Drugie rozwiązanie zapewnia własne pułapki, po pierwsze, musisz napisać cały swój obraz / dźwięk / etc. ładowanie procedur korzystających z niestandardowego interfejsu API w celu uzyskania dostępu do zarchiwizowanych danych. Kolejną wadą jest to, że musisz napisać własne narzędzie do archiwizacji, aby zbudować archiwa.

Jeśli nie będziesz zawsze ładować wszystkich plików z archiwum, TAR / GZ może nie być dobrym pomysłem, ponieważ nie możesz wyodrębnić określonych plików, ponieważ są one potrzebne. Jest to powód, dla którego wiele gier korzysta z archiwów ZIP, które pozwalają na wyodrębnianie poszczególnych plików zgodnie z wymaganiami (dobrym przykładem jest Quake 3, którego pliki PK3 to nic innego jak pliki ZIP z innym rozszerzeniem).

EDYCJA: „Ukryj” strukturę folderów gry i „Zachowaj” tylko pliki wykonywalne

Często stosuje się inne rozwiązanie do „ukrywania” plików gry w strukturze folderów. Zachowaj tylko pliki wykonywalne i może plik Readme w głównym katalogu i przenieś pliki gry do podfolderu o nazwie „dane” lub innego pokrewnego.

EDYCJA: Gamedev Tuts Plus ma niezły zasób

EDYCJA: libarchive

Jedno potencjalne rozwiązanie libarchive, które jest biblioteką do archiwizacji, która będzie obsługiwać rozpakowywanie plików z archiwum, takiego jak plik ZIP. Pozwala nawet przypisać wyodrębniony plik do standardowego wskaźnika PLIKU, co znacznie ułatwiłoby interakcję z dowolnymi innymi bibliotekami.

EDYCJA: Pliki w formacie ZIP z alternatywnym rozszerzeniem

Tutaj podoba mi się komentarz @Joachima Sauera

Używanie plików ZIP-format z alternatywnych rozszerzeń ma wielką tradycję poza grami, a także: Java robi to , na OpenDocument Format (aka format OpenOffice / LibreOffice) to robi , nawet Office Open XML (aka "nowego" formatu Microsoft Office) robi .

Mahbubur R. Aaman
źródło
2
Tak, Thief / SystemShock2 użył plików .zip, które przemianowano również na coś innego. W Javie możesz użyć czegoś takiego jak TrueZip, aby uzyskać dostęp do plików w zamkach, tak jakby były plikami w folderach. Sądzę, że istnieją podobne biblioteki dla C ++.
Nick
18
Używanie plików ZIP-format z alternatywnych rozszerzeń ma wielką tradycję poza grami, a także: Java robi to , na OpenDocument Format (aka format OpenOffice / LibreOffice) to robi , nawet Office Open XML (aka "nowego" formatu Microsoft Office) robi to ...
Joachim Sauer,
5
@Svish. W zależności od platformy ilość miejsca na dysku zajmowanego przez wiele małych plików może być znacznie większa niż ilość zajmowana przez jeden duży plik, nawet jeśli ten duży plik nie jest w ogóle kompresowany ( .tarna przykład). Ma to związek ze sposobem fizycznego przechowywania danych na dysku.
TRiG
1
Ach, to prawda. Nie powinno to być wiele, chyba że jest ich dużo , ale w takim przypadku może rzeczywiście się rozbudować. Mogę sobie wyobrazić, że instalacja i dezinstalacja również wymagają dużej ilości małych plików.
Svish,
2
Lekko związany z komentarzem Kylotana, tutaj jest post Jonathana Blow'a na blogu deweloperów The Witness na temat korzystania z archiwów i ich interakcji z mechanizmem łatania Steam. „Świadek pakuje większość swoich danych do jednego 2-gigabajtowego pliku przechowywanego w formacie .zip. Przed przesłaniem początkowej wersji do Steam, zabrałem się za zabezpieczenie, aby zminimalizować rozmiary łat, a przynajmniej tak pomyślałem [...] (Wyobraź sobie że pliki są przechowywane w losowej kolejności: prawdopodobnie każda łatka wymaga, aby każdy gracz ponownie pobierał całą grę!) ”
Eric,
39

Innym rozwiązaniem często używanym do „ukrywania” plików gry jest struktura folderów. Zachowaj tylko pliki wykonywalne i może readme w głównym katalogu i przenieś pliki gry do podfolderu „data”. Nie sądzę, że jest to bardzo rzadkie. Wiele gier, które znam, przechowują swoje treści w taki sposób.

Tom Van Green
źródło
8
+1 Jeśli miejsce na dysku lub ochrona nie stanowi problemu, jest to najłatwiejsza naprawa.
Laurent Couvidou,
1
+1, ponieważ inny facet powiedział +1. Nie może się mylić, co? (Żartuję, świetna odpowiedź.)
jcora,
Moim zdaniem jest to idealny wybór. Jeśli system plików nie jest w stanie tego skutecznie obsłużyć, oznacza to, że jest on uszkodzony i powinieneś skorzystać z narzędzia do tworzenia systemu operacyjnego, aby go poprawić.
Wszechobecny
3
@Omnifarious Nie zawsze jest to prawdą, np. Podczas odczytu z dysku optycznego, nawet przy doskonałym systemie plików, często pakuje się pliki w celu załadowania, aby zapobiec nadmiernemu wyszukiwaniu (przyspieszenie może być dość zaskakujące). Ale to jest zupełnie inna historia dla dysków twardych i wydaje mi się, że OP jest w tym przypadku.
Laurent Couvidou,
3
@ Mr.Beast Przegapiłeś mój punkt. Mówię o dyskach optycznych. Pracowałem dla studia, w którym praca na pełny etat jednego programisty polegała na dopilnowaniu, aby pliki były pakowane na płycie DVD tak wydajnie, jak to możliwe, aby uzyskać najlepszy możliwy czas ładowania. Jestem pewien, że chętnie się dowie, że mógł po prostu polegać na systemie plików DVD;)
Laurent Couvidou
22

Naprawdę podoba mi się za to PhysFS . Umożliwia dostęp do folderów lub archiwów zip z tym samym kodem. Działa dobrze na wszystkich etapach życia Gry.

  1. Podczas programowania : dostęp do zasobów bezpośrednio z hierarchii folderów. W ten sposób skompresowane archiwa nie przeszkadzają i można szybko iterować.
  2. Wstępne wdrożenie : spakuj zasoby, aby ułatwić wdrożenie / szybkie instalacje. Nie trzeba zmieniać kodu. Po prostu skieruj PhysFS na zip zamiast na folder.
  3. Aktualizacje / Modding : PhysFS może załadować wiele archiwów zip, w których zasoby jednego z nich zastępują inne. Aktualizacje mogą być tak proste, jak nowy plik zip ze tylko zmienionymi plikami. Podobnie w przypadku modowania.

aktualizacja:

Skorzystałem z samouczka dołączonego do źródła i dokumentacji doxygen, aby nauczyć się PhysFS. Interfejs API jest naprawdę dość prosty, poświęcisz więcej czasu na naukę ładowania obrazów do SFML przez bufory pamięci zamiast ścieżki pliku.

deft_code
źródło
4
Korzystam z PhysFS do mojego obecnego projektu i uwielbiam go. Nie zawsze muszę ponownie generować plik archiwum treści; Mogę po prostu upuścić zaktualizowaną wersję na ścieżkę wyszukiwania i BAM! To działa.
Zack The Human,
Po kilku odpowiedziach zdecydowałem, że pójdę z physFS. Czy chciałbyś polecić fajny samouczek? :)
Bugster,
12

Sugerowałbym użycie pliku ZIP. Jest to wszechobecny format, a znajdziesz gotowe biblioteki, które pozwalają ładować pliki z pliku ZIP. Szybka wyszukiwarka Google ujawniła nawet program ładujący zip dla sfml .

grzmot
źródło
3

Cóż, możesz oszukiwać tak, jak wspomniano :) Możesz zrobić arkusz sprite ze zdjęć, nie ma potrzeby, aby go teraz spakować, chyba że pozwoli to zaoszczędzić mnóstwo miejsca. Po utworzeniu arkusza duszków lub kilku arkuszy duszków z obrazów możesz po prostu zmienić ich rozszerzenia. Większość graczy nie zadaje sobie trudu, aby to sprawdzić i dlaczego nie pozostawić tej opcji Artystom, którzy mogą chcieć zmodyfikować Twoją grę w przyszłości? W ten sposób mogą też utworzyć arkusz ikon, zmienić nazwę jego rozszerzenia i zacząć się rozwijać.

W przypadku plików tekstowych pokornie sugeruję konwersję tych danych do postaci binarnej. Jestem pewien, że znajdziesz prosty sposób, aby to zrobić. Na przykład, jeśli używasz tylko AZ, az i 0-9, możesz użyć 6 bitów do reprezentowania każdej postaci, co w pewien sposób ochroni twój materiał chroniony prawem autorskim, to uniemożliwi również innym edytowanie map. Zawsze możesz dodać konwerter map, jeśli chcesz. Jednak kompresowanie tekstu jest całkowicie rozsądne.

wolfdawn
źródło
Konwersja na pliki binarne jest dobrą radą, ale nie dla ochrony - po prostu łatwiej będzie ją przeanalizować i szybciej załadować. Sugerowałbym to jako etap wstępnego przetwarzania, ale to będzie nie na temat pytania.
Maximus Minimus,
Cóż, domyślam się, że jeśli chce go skuteczniej chronić, może spróbować zaszyfrować go w RSA lub podobnym algorytmie (nie ma takiej potrzeby). Wątpię, czy ktokolwiek użyje plików map z gry niezależnej, jeśli są one zawarte w pliku binarnym. Po prostu nie warto poświęcać czasu na zastanawianie się nad analizą. Pliki tekstowe są po prostu całkowicie podatne na atak i jak sugerowałeś coś nieskutecznego do przechowywania danych.
wolfdawn
3
Na dyskach twardych ładowanie jednego pliku zip jest szybsze niż wiele małych plików, ponieważ na dysk fizyczny są tańsze losowe wyszukiwania. Plik binarny dla małej gry można zmapować do pamięci i działać „magicznie”, prawie nie wymaga analizy.
Liosan,
@Liosan Mogłeś źle zinterpretować to, co miałem na myśli, lub źle cię zrozumiałem. Powiedziałem, że binarny jest lepszy do przechowywania danych i że inni projektanci gier raczej nie chcą nauczyć się analizować kodu binarnego mapy, chyba że jest to udokumentowane i zachęcane do modowania cele. Dlatego oferuje pewną podstawową ochronę plików tekstowych.
wolfdawn
2

Nie chodzi tylko o liczbę zasobów lub miejsca na dysku.
W przypadku wielu różnych plików tekstur, ponieważ używasz SFML, który renderuje w OpenGL, za każdym razem, gdy będziesz renderować teksturę, OpenGL musi powiązać następną teksturę z kartą wideo (sprawdź glBindTexture ()) i jest to naprawdę drogie zadanie.
Mając to na uwadze, możesz zrozumieć, dlaczego gry zazwyczaj umieszczają wiele duszków w tej samej teksturze, tak zwane arkusze duszków, zgodnie z menu / poziomami / mapami gry.
Rezultatem jest ogromny wzrost wydajności, ponieważ renderujesz wiele duszków z tym samym wywołaniem tekstury wiązania.

Edmo Freitas
źródło
Po uzyskaniu kilku odniesień do tworzenia arkusza sprite'u rozważałem pewne refaktoryzowanie w celu zmniejszenia liczby obrazów. Dzięki
Bugster,
2

Osobiście wybrałbym w tym celu niestandardową trasę pliku binarnego. Jest to coś, co robię teraz cały czas, nie jest tak trudne, jak mogłoby się wydawać, a także zapewnia pewien poziom zaciemnienia plików zasobów gry. Niedawno napisałem mały wstępny artykuł Gamedev, jeśli jesteś zainteresowany:

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

Arkusze sprite są zupełnie innym tematem, ale są normą w większości gier :)

Si Robertson
źródło
1

Inną metodą, której możesz użyć:

Darmowa wersja XnView zawiera funkcję o nazwie „ Strip of Images” (SHIFT + A), która umożliwia tworzenie sprite-collections.

Minimalizuje to dostęp do plików i jest szczególnie ważne dla aplikacji / gier internetowych, aby zminimalizować liczbę HTTP-roundtrips.

Dostęp do poszczególnych obrazów jest następnie przyznawany poprzez mapy współrzędnych (na przykład definicje css).

Lorenz Lo Sauer
źródło
0

Najpierw musisz napisać własny obraz / dźwięk / etc. ładowanie procedur korzystających z niestandardowego interfejsu API w celu uzyskania dostępu do zarchiwizowanych danych. Kolejną wadą jest to, że musisz napisać własne narzędzie do archiwizacji, aby zbudować archiwa. Jeśli nie będziesz zawsze ładować wszystkich plików z archiwum, TAR / GZ może nie być dobrym pomysłem, ponieważ nie możesz wyodrębnić określonych plików, ponieważ są one potrzebne. Jest to powód, dla którego wiele gier korzysta z archiwów ZIP, które pozwalają na wyodrębnianie poszczególnych plików zgodnie z wymaganiami (dobrym przykładem jest Quake 3, którego pliki PK3 to nic innego jak pliki ZIP z innym rozszerzeniem). http://zpp-library.sourceforge.net/


źródło