Bagaimana Anda bisa menempatkan semua gambar dari game ke 1 file?

67

Saya baru saja menyelesaikan game RPG dasar yang ditulis dalam C ++ SFML, saya telah berusaha keras untuk game ini dan saya ingin mendistribusikannya, namun saya mengalami masalah kecil.

Masalahnya adalah, saya memiliki lebih dari 200 gambar dan file peta (mereka file .txt yang menyimpan kode peta) semua dalam folder yang sama dengan yang dapat dieksekusi, ketika saya melihat di folder, itu membuat saya ingin menangis sedikit melihat begitu banyak sumber daya, saya belum pernah melihat permainan yang menunjukkan semua sumber daya secara langsung, sebaliknya saya percaya mereka mengemas sumber daya dalam file tertentu.

Nah, itulah yang saya coba capai: Saya berharap untuk mengemas semua gambar dalam 1 file (Mungkin file .txt juga) kemudian bisa membaca dari file itu atau dengan mudah menambahkannya.

Bugster
sumber
Saya telah melihat kode di mana semua gambar dikemas ke dalam string dalam kode. Tetapi itu dilakukan karena persyaratan. (Itu adalah kompetisi 64KB Jawa)
Omar Kooheji
Maaf itu adalah kompetisi java 4Kb. Bukan yang 64Kb.
Omar Kooheji

Jawaban:

62

Pemrogram game mengandalkan salah satu dari dua metode utama penyimpanan data:

  • menyimpan setiap file data sebagai file terpisah
  • menyimpan setiap file data dalam format arsip khusus

Kelemahan dari solusi pertama adalah masalah ruang disk yang terbuang, serta masalah instalasi yang lebih lambat.

Solusi kedua menyediakan perangkapnya sendiri, pertama adalah Anda harus menulis semua gambar Anda sendiri / suara / dll. memuat rutin yang menggunakan API khusus untuk mengakses data yang diarsipkan. Kelemahan lebih lanjut adalah bahwa Anda harus menulis utilitas arsip Anda sendiri untuk membangun arsip di tempat pertama.

Kecuali Anda akan selalu memuat semua file dari arsip, TAR / GZ mungkin bukan ide yang sangat bagus, karena Anda tidak dapat mengekstraksi file tertentu sesuai kebutuhan. Inilah alasan mengapa banyak game menggunakan arsip ZIP, yang memungkinkan Anda untuk mengekstrak file individual sebagaimana diperlukan (contoh yang baik adalah Quake 3, yang file PK3 tidak lain adalah file ZIP dengan ekstensi yang berbeda).

Sunting: "Sembunyikan" struktur folder gim dan "Simpan" hanya yang dapat dieksekusi

Solusi lain sering digunakan untuk "menyembunyikan" file game dalam struktur folder. Simpan hanya file executable Anda dan mungkin file readme di direktori utama dan pindahkan file game ke sub folder bernama "data" atau yang terkait lainnya.

EDIT: Gamedev Tuts Plus memiliki sumber daya yang bagus

EDIT: libarchive

Salah satu solusi potensial libarchive, yang merupakan perpustakaan pengarsipan yang akan menangani mengekstraksi file dari arsip seperti file ZIP. Bahkan memungkinkan Anda untuk menetapkan file yang diekstraksi ke pointer FILE standar, yang akan membuat berinteraksi dengan perpustakaan lain yang berpotensi lebih mudah.

EDIT: ZIP Memformat file dengan ekstensi alternatif

Di sini, saya suka @ Joachim Sauer's Comment

Menggunakan file berformat ZIP dengan ekstensi alternatif juga memiliki tradisi di luar permainan: Java melakukannya , Format OpenDocument (alias format OpenOffice / LibreOffice) melakukannya , bahkan Office Open XML (alias format Microsoft Office "baru") apakah itu .

Mahbubur R Aaman
sumber
2
Ya, Pencuri / SystemShock2 menggunakan file zip. Mengganti nama menjadi sesuatu yang lain juga. Di Java Anda dapat menggunakan sesuatu seperti TrueZip untuk mengakses file dalam ritsleting seolah-olah mereka file dalam folder, saya membayangkan ada perpustakaan serupa untuk C ++.
Nick
18
Menggunakan file berformat ZIP dengan ekstensi alternatif juga memiliki tradisi di luar permainan: Java melakukannya , Format OpenDocument (alias format OpenOffice / LibreOffice) melakukannya , bahkan Office Open XML (alias format Microsoft Office "baru") apakah itu , ...
Joachim Sauer
5
@Vish. Bergantung pada platform, jumlah ruang disk yang diambil oleh banyak file kecil bisa jauh lebih besar daripada jumlah yang diambil oleh satu file besar, bahkan jika file besar itu tidak dikompresi sama sekali ( .tar, misalnya). Ini berkaitan dengan cara data disimpan secara fisik di disk.
TRiG
1
Ah, benar juga. Seharusnya tidak banyak, kecuali ada banyak , tetapi dalam kasus itu memang bisa menumpuk. Saya bisa membayangkan instalasi dan penghapusan juga mengambil hit dengan banyak file kecil.
Svish
2
Sedikit terkait dengan komentar Kylotan, berikut ini adalah posting oleh Jonathan Blow di blog dev The Witness tentang penggunaan arsip dan bagaimana mereka berinteraksi dengan mekanisme perbaikan Steam. "Saksi mengemas sebagian besar datanya ke dalam file 2-gigabyte tunggal yang disimpan dalam format .zip. Sebelum mengunggah versi awal ke Steam, saya mengambil perlindungan untuk meminimalkan ukuran tambalan, atau jadi saya pikir [...] (Bayangkan bahwa file disimpan dalam urutan acak: mungkin setiap tambalan melibatkan setiap pemain mengunduh ulang seluruh permainan!) "
Eric
39

Solusi lain yang sering digunakan untuk "menyembunyikan" file game adalah struktur folder. Simpan hanya file executable Anda dan mungkin readme di direktori utama dan pindahkan file game ke dalam "folder" data folder. Saya pikir itu tidak biasa. Banyak game yang saya tahu menyimpan konten mereka sedemikian rupa.

tom van green
sumber
8
+1 Jika ruang disk atau perlindungan bukan merupakan masalah, itu adalah perbaikan yang paling mudah.
Laurent Couvidou
1
+1 karena orang lain berkata +1. Tidak mungkin salah, kan? (Bercanda selain, jawaban yang bagus.)
jcora
Ini, menurut saya, adalah pilihan ideal. Jika sistem file tidak dapat menangani itu dengan efisien, sistem file rusak dan Anda harus bersandar pada pembuat OS untuk memperbaikinya.
Mahakuasa
3
@Omnifarious Itu tidak selalu benar, misalnya ketika membaca dari disk optik, bahkan dengan sistem file yang sempurna, itu umum untuk mengemas file dalam urutan pemuatan untuk mencegah pencarian yang berlebihan (mempercepat sebenarnya bisa sangat mengejutkan). Tapi ini adalah cerita yang sama sekali berbeda untuk hard disk, dan saya cenderung berpikir OP ada dalam kasus ini.
Laurent Couvidou
3
@ Mr.Beast Anda melewatkan poin saya. Saya berbicara tentang disk optik. Saya telah bekerja untuk sebuah studio di mana itu adalah pekerjaan penuh waktu seorang programmer tunggal untuk memastikan file akan dikemas seefisien mungkin pada DVD, untuk mendapatkan waktu pemuatan terbaik. Saya yakin dia akan senang mengetahui bahwa dia hanya bisa mengandalkan sistem file DVD;)
Laurent Couvidou
22

Saya sangat suka PhysFS untuk ini. Ini memungkinkan Anda untuk mengakses folder atau arsip zip dengan kode yang sama. Ini bekerja dengan baik untuk semua tahap seumur hidup Game.

  1. Selama pengembangan : akses sumber daya secara langsung dari hierarki folder. Dengan cara ini arsip yang dikompresi tidak menghalangi dan Anda dapat dengan cepat beralih.
  2. Penempatan awal : rangkai sumber daya Anda untuk pemasangan yang mudah / pemasangan cepat. Tidak ada kode yang perlu diubah. Arahkan saja PhysFS di zip bukan folder.
  3. Pembaruan / Modding : PhysFS dapat memuat beberapa arsip zip di mana sumber daya dari satu menimpa yang lain. Pembaruan dapat sesederhana zip baru dengan hanya file yang diubah. Begitu pula untuk modding.

memperbarui:

Saya menggunakan tutorial yang disertakan dengan sumber dan dokumentasi doxygen untuk mempelajari PhysFS. API ini sebenarnya cukup sederhana, Anda akan menghabiskan lebih banyak waktu mempelajari cara memuat gambar ke SFML melalui buffer memori alih-alih dengan path file.

deft_code
sumber
4
Saya menggunakan PhysFS untuk proyek saya saat ini dan saya menyukainya. Saya tidak selalu perlu membuat ulang file arsip konten saya; Saya hanya bisa menjatuhkan versi yang diperbarui di jalur pencarian dan BAM! Berhasil.
Zack The Human
Setelah beberapa jawaban saya memutuskan saya akan pergi dengan PhysFS. Apakah Anda mau merekomendasikan tutorial yang bagus? :)
Bugster
12

Saya sarankan menggunakan file ZIP. Ini adalah format yang ada di mana-mana dan Anda akan menemukan pustaka siap pakai yang memungkinkan Anda memuat file dari dalam file ZIP. Pencarian Google cepat bahkan mengungkapkan pemuat zip untuk sfml .

bummzack
sumber
3

Nah, Anda bisa curang seperti yang mereka sebutkan :) Anda dapat membuat sprite-sheet dari citra, tidak perlu lagi meng-zipnya saat ini kecuali menghemat banyak ruang. Setelah Anda membuat lembar-sprite atau beberapa lembar-sprite dari gambar, Anda bisa mengganti nama ekstensi mereka. Sebagian besar Gamer tidak akan repot untuk memeriksa dan mengapa tidak menyerahkan opsi itu ke Artis yang mungkin ingin mengubah gim Anda di masa mendatang? Dengan cara itu mereka juga dapat membuat sprite-sheet, ganti ekstensi itu dan mulai bergulir.

Dengan file teks, saya dengan rendah hati menyarankan Anda mengubah data itu menjadi bentuk biner. Saya cukup yakin Anda akan menemukan cara sederhana untuk melakukannya .. Misalnya, jika Anda hanya menggunakan AZ, az dan 0-9, Anda dapat menggunakan 6 bit untuk mewakili setiap karakter, yang agak akan melindungi materi berhak cipta Anda, itu juga akan mencegah orang lain mengedit peta .. Anda selalu dapat menambahkan konverter peta jika Anda mau. Zip benar-benar masuk akal untuk teks.

serigala
sumber
Konversi ke biner adalah saran yang bagus tetapi tidak untuk perlindungan - itu hanya akan lebih mudah diurai dan lebih cepat dimuat. Akan menyarankan itu sebagai langkah pra-pemrosesan, tapi itu akan di luar topik untuk pertanyaan.
Maximus Minimus
Yah, saya kira, jika dia ingin melindunginya lebih efektif, dia bisa mencoba mengenkripsi dalam RSA atau algoritma serupa (tidak perlu). Saya ragu ada orang yang menggunakan file peta secara tidak sah dari game indie jika ada di dalam file biner. Rasanya tidak ada gunanya menginvestasikan waktu dalam mencari parsing kami. File teks sangat rentan dan ketika Anda menyarankan sesuatu yang tidak efektif untuk menyimpan data.
wolfdawn
3
Pada HDD, memuat file zip tunggal lebih cepat daripada banyak file kecil karena ada yang lebih murah mencari acak ke disk fisik. Biner untuk gim kecil dapat dipetakan ke dalam memori dan berfungsi "secara ajaib", hampir tidak memerlukan penguraian.
Liosan
@Liosan Anda bisa saja salah mengartikan apa yang saya maksudkan atau saya salah paham dengan Anda .. Saya berkata biner lebih baik untuk menyimpan data dan bahwa perancang game lain tidak mungkin ingin mempelajari cara menguraikan kode peta biner Anda, kecuali jika didokumentasikan dan didorong untuk modding tujuan. Oleh karena itu ia menawarkan beberapa perlindungan mendasar terhadap file teks.
wolfdawn
2

Ini bukan hanya tentang jumlah sumber daya atau ruang disk.
Dengan banyak file tekstur yang berbeda, saat Anda menggunakan SFML, yang merender dengan OpenGL, setiap kali Anda akan merender tekstur, OpenGL perlu mengikat tekstur berikutnya ke kartu video (periksa glBindTexture ()), dan itu adalah tugas yang sangat mahal.
Dengan mengingat hal itu, Anda dapat menyadari mengapa gim biasanya menempatkan sejumlah sprite dalam tekstur yang sama, yang disebut spritesheets, sesuai dengan menu / level / peta gim Anda.
Hasilnya adalah keuntungan besar dalam kinerja, karena Anda merender banyak sprite dengan panggilan tekstur ikatan yang sama.

Edmo Freitas
sumber
Setelah mendapatkan beberapa referensi untuk membuat spritesheet, saya telah mempertimbangkan beberapa refactoring untuk menurunkan jumlah gambar. Terima kasih
Bugster
2

Saya pribadi akan menuju rute file biner kustom untuk ini. Ini adalah sesuatu yang saya lakukan sendiri sepanjang waktu sekarang, tidak sesulit kedengarannya, dan juga memberikan tingkat kebingungan bagi Anda file sumber daya game. Saya menulis artikel pengantar kecil Gamedev tentang ini belum lama ini jika Anda tertarik:

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

Sprite-sheet adalah subjek yang sepenuhnya berbeda tetapi itu adalah norma untuk kebanyakan game :)

Si Robertson
sumber
1

Metode lain yang dapat Anda gunakan:

Versi gratis XnView menyediakan fitur yang disebut " Strip of Images" (SHIFT + A), yang memungkinkan Anda membuat sprite-collections.

Ini meminimalkan akses file dan sangat penting untuk aplikasi / game web untuk meminimalkan jumlah HTTP-roundtrips.

Akses ke gambar individual kemudian diberikan melalui peta koordinat (misalnya definisi-css).

Lorenz Lo Sauer
sumber
0

Pertama, Anda harus menulis semua gambar Anda sendiri / suara / dll. memuat rutin yang menggunakan API khusus untuk mengakses data yang diarsipkan. Kelemahan lebih lanjut adalah bahwa Anda harus menulis utilitas arsip Anda sendiri untuk membangun arsip di tempat pertama. Kecuali Anda akan selalu memuat semua file dari arsip, TAR / GZ mungkin bukan ide yang sangat bagus, karena Anda tidak dapat mengekstrak file tertentu sesuai kebutuhan. Inilah alasan mengapa banyak game menggunakan arsip ZIP, yang memungkinkan Anda untuk mengekstrak file individual sebagaimana diperlukan (contoh yang baik adalah Quake 3, yang file PK3 tidak lain adalah file ZIP dengan ekstensi yang berbeda). http://zpp-library.sourceforge.net/


sumber