Bagaimana cara seseorang menyelamatkan dunia prosedural?

17

Saya baru-baru ini membaca tentang cara membuat dunia prosedural ... tapi bagaimana cara menyimpannya?

Dalam permainan seperti Terraria atau Minecraft, pengguna dapat dengan bebas memodifikasi lansekap, tetapi dunia itu tidak dapat diciptakan kembali dari benih awal. Teknik apa yang digunakan untuk menyelamatkan dunia prosedural tetapi dapat dimodifikasi?

pengguna1075940
sumber

Jawaban:

21

Simpan benih yang Anda gunakan untuk menghasilkan dunia, dan modifikasi baik sebagai "perintah" atom atau hasil dari itu.

Kemudian saat memuat game yang disimpan, Anda melakukan hal berikut:

  1. Secara prosedural menghasilkan bagian dari dunia yang sedang Anda kunjungi.
  2. Terapkan perintah yang disimpan, atau timpa elemen yang dihasilkan dengan yang disimpan.

Pembaruan: Dan tentu saja, ada opsi untuk menyelamatkan dunia yang Anda hasilkan seperti dunia normal, jika sumber dayanya tersedia (seperti yang terlihat di Minecraft). Dalam hal ini, Anda harus menyimpan hanya bagian-bagian dunia yang telah dikunjungi (jika tidak, generasi prosedural akan menjadi sangat tidak berguna), ubin demi ubin. Ini memakan lebih banyak sumber daya HDD dan / atau basis data, tetapi akan membutuhkan daya CPU lebih sedikit saat memuat game.

Marton
sumber
2
Selain modifikasi, ia mungkin juga perlu menyelamatkan benih yang digunakan untuk membangun dunia prosedural ;-)
bummzack
@bummzack Ya tentu saja, saya lupa menyebutkan itu, karena sudah jelas :-) Saya akan mengedit jawaban saya.
Marton
10
Saya tidak sepenuhnya yakin bahwa regenerasi dunia dari benih adalah ide terbaik. Generasi dunia biasanya melibatkan algoritme yang kompleks dan karenanya membutuhkan waktu: kami menghasilkan dunia acak bukan untuk menghemat ruang tetapi untuk mengambil manfaat dari keacakan. Karena itu saya akan mempertimbangkan bahwa menyelamatkan seluruh dunia dalam format biner akan lebih efisien.
Jonathan Connell
2
Jadi Anda mengatakan untuk menyelamatkan dunia yang dihasilkan secara prosedural, Anda menghasilkannya, lalu menyimpannya? Ini bukan jawaban yang sangat lengkap.
MichaelHouse
2
@ Random832 Minecraft memang menyelamatkan dunia dalam format biner, alih-alih meregenerasinya dari seed dan memutar ulang modifikasi. Untuk mengatasi masalah menyelamatkan seluruh dunia, Minecraft hanya menyimpan potongan yang telah dihasilkan sejauh ini. Saat Anda menjelajahi dunia lebih jauh, save game Anda menjadi lebih besar.
Joseph Mansfield
8

Menyimpan dunia yang dihasilkan secara prosedur sama dengan menyimpan data peta ubin apa pun.

Anda mungkin ingin menyelamatkan dunia dalam format biner, dengan asumsi dunia dibangun dari berbagai jenis ubin, Anda harus:

  1. Tentukan jumlah total jenis ubin yang berbeda. (Tergantung bahwa Anda akan membutuhkan lebih banyak atau lebih sedikit bit untuk mewakili setiap ubin)
  2. Tentukan lebar dan tinggi dunia yang dikunjungi (dimodifikasi).
  3. Mewakili ubin dunia demi ubin dari ubin paling atas paling kiri (termasuk langit) baris demi baris ke ubin paling kanan bawah.
  4. Jika Anda ingin menghemat ruang, gunakan DEFLATE atau algoritma serupa untuk mengompresi array 2d ini (direpresentasikan sebagai 1-d) http://en.wikipedia.org/wiki/DEFLATE
  5. Gunakan file I / O yang sesuai untuk API Anda untuk menyimpan data pada disk.

Anda dapat menggunakan metode yang sama untuk menyimpan peta berbasis voxel juga.

Menyimpan model peta berbasis simpul lebih kompleks.

Apakah Anda ingin saya menguraikan masalah itu?

serigala
sumber
Jika Anda mau, Anda mungkin dapat menyimpannya di file png dengan meng-coding warna setiap ubin. Ini akan memungkinkan Anda untuk meninjau hasil secara cepat tanpa menggunakan penampil khusus.
wolfdawn
3

Apapun struktur data yang Anda gunakan untuk menyimpan dunia dalam memori dapat digunakan sebagai templat untuk menulis dan membaca dari disk. Bagian prosedural dari gim Anda akan mengisi struktur data ini pertama kali, jika tidak ada data yang tersedia dari disk. Kemudian, ketika Anda siap untuk membongkar area dari memori, tulis ke disk karena telah dibuat atau dimodifikasi.

Setiap kali Anda siap untuk memuat area baru ke dalam memori, periksa terlebih dahulu untuk melihat apakah sudah dibuat sebelumnya dan disimpan ke disk. Jika sudah, muat dari disk alih-alih dari algoritma pembuatan prosedural Anda.

Biasanya ini akan dilakukan dengan potongan medan. Anda bisa menyimpan setiap potongan ke file sendiri, atau membuat struktur disk yang lebih kompleks yang berisi data dalam satu file dengan tabel pencarian. Ada pertanyaan lain tentang cara yang baik untuk menyimpan data Anda ke disk.

MichaelHouse
sumber