Saat ini saya menghasilkan data level saya, dan menyimpan ke disk untuk memastikan bahwa setiap modifikasi yang dilakukan pada level disimpan.
Saya menyimpan "potongan" 2048x2048 piksel ke dalam file. Setiap kali pemain bergerak ke bagian yang tidak memiliki file yang terkait dengan posisi, file baru dibuat.
Ini berfungsi dengan baik, dan sangat cepat. Masalah saya, adalah saat Anda memainkan jumlah file semakin besar.
Saya bertanya-tanya apa saja teknik yang dapat digunakan untuk mengurangi jumlah file, tanpa membuat kinerja menjadi hit. Saya tertarik pada bagaimana Anda akan menyimpan / mencari / memperbarui data ini dalam satu file, bukan beberapa file secara efisien.
xna
c#
level-design
data-structure
jallan
sumber
sumber
Jawaban:
Cara tercepat untuk melakukan ini adalah menyimpan segala sesuatu dalam satu file dan lompat kursor ke potongan yang ingin Anda baca. Setelah Anda menekan disk membaca urutan dari titik itu cukup cepat.
Beberapa hit ke INode yang berbeda untuk menemukan lokasi file pada volume fisik yang mengambil sebagian besar waktu dan juga apa skala yang buruk.
Selain itu, karena ini dinamis, Anda juga akan memerlukan peta yang menyimpan offset dalam file untuk setiap chunk.
Pada Disk
Terlihat
Maka Anda hanya perlu membuka aliran yang membaca dari file tetapi tidak mengunci aliran / proses lain dari mengaksesnya. Maka Anda perlu membaca dari offset yang benar untuk jarak yang benar. Saya percaya C # di bawah ini.
Sekarang karena fakta bahwa Anda membuka aliran dalam mode readonly dan memungkinkan orang lain untuk Baca / Tulis, Anda dapat terus menambahkan potongan baru sampai akhir. Catat nomor offset mereka dan jangan mencoba membacanya sebelum mereka ada di sana.
PS Anda tidak akan ingin menggunakan blok menggunakan karena Anda akan ingin hanya 1 aliran membaca sepanjang umur tingkat apa pun yang Anda gunakan. Anda juga mungkin harus menyimpan pemetaan chunk ke file lain saat keluar tetapi itu hanya satu beban ketika Anda memuat level Anda.
sumber
Bergantung pada waktu yang dibutuhkan untuk membuat chunk, Anda bisa menyimpan diff atau keadaan saat ini (lokasi musuh, dll). Saat pemain bergerak kembali ke chunk, ia menghasilkan lagi menggunakan seed yang disimpan, kemudian memuat perubahan apa pun yang dibuat dari file.
Jika pemain diizinkan untuk membuat perubahan signifikan, ini mungkin lambat dan file diff masih akan cukup besar, tetapi hanya untuk perubahan kecil, harus menjadi operasi yang murah. Beberapa chunk diffs dapat dikonsolidasikan ke dalam satu file juga - sesuatu yang berukuran cukup yang dapat dimuat ke dalam memori.
Anda mungkin tidak ingin memindahkan semua diff ke dalam satu file - yang membuka sejumlah masalah lain dengan memori, atau mengubah bagian tengah file.
sumber
Saya tahu ini adalah thread yang cukup lama - tetapi saya hanya ingin berpadu bahwa saya pikir arsip ZIP mungkin merupakan cara terbaik untuk pergi ke sini. Anda mendapatkan kompresi dengan data Anda (jika Anda menggunakan bitmap mentah, khususnya), keterbacaan dalam sistem operasi, dan Anda mendapatkan file tunggal seperti yang Anda inginkan.
sumber
Bagaimana dengan pemindaian dir untuk memeriksa cap waktu file di direktori level data vs file aktif saat ini dan memberikan rahmat dari file sebelumnya dan file maju setiap 10 detik atau lebih, dan apa pun yang tidak digunakan hapus saja.
Kecuali Anda mengharuskan pemain untuk kembali. Kemudian hanya membersihkan data level setelah penyelesaian level atau pos pemeriksaan? Bisa jadi besar pasti, tapi saya tidak berpikir ada banyak pilihan yang tersedia di sini
sumber
Bagaimana dengan beberapa potongan per file? Anda mengatakan potongan Anda adalah 2048 x 2048, bagaimana kalau menempatkan 16384 x 16384 dalam file. Tandai yang mana saja yang ada sehingga Anda tahu apakah Anda perlu membuatnya.
sumber
Jika Anda dapat membuat potongan cukup cepat saat pemain menjelajahinya, maka Anda tidak perlu menyimpannya di disk sama sekali; yang perlu Anda lakukan adalah menyimpan seed untuk fungsi perlin noise yang Anda gunakan untuk menghasilkan konten prosedural Anda lagi sesuai permintaan.
Ini dapat disimpan dalam satu file, dan dapat ditulis secara berurutan dan diurutkan dalam RAM saat dimuat; tidak perlu untuk struktur yang rumit di dalam file itu sendiri pada disk. Anda dapat membaca dari itu hanya pada saat startup, dan menulis saat Anda menghasilkan 'halaman' baru (sebagaimana mereka disebut) di dunia game.
sumber