aplikasi mogok ketika mencapai 1.5Gb.
Ini sangat menyarankan bahwa Anda tidak mewakili ubin Anda dengan benar, karena ini berarti bahwa setiap ubin berukuran ~ 80 byte.
Yang perlu Anda pahami adalah bahwa perlu ada pemisahan antara konsep gameplay ubin, dan ubin visual yang dilihat pengguna. Dua konsep ini bukan hal yang sama .
Ambil Terraria sebagai contoh. Dunia Terraria terkecil membutuhkan 4200x1200 ubin, yaitu 5 juta ubin. Sekarang, berapa banyak ingatan yang diperlukan untuk mewakili dunia itu?
Nah, setiap ubin memiliki lapisan latar depan, lapisan latar belakang (dinding latar belakang), "lapisan kawat" di mana kabel pergi, dan "lapisan furnitur" di mana item furnitur pergi. Berapa banyak memori yang diambil setiap ubin? Sekali lagi, kita hanya berbicara secara konseptual, bukan secara visual.
Ubin latar depan dapat dengan mudah disimpan dalam waktu singkat yang tidak ditandatangani. Tidak ada lebih dari 65536 jenis ubin latar depan, jadi tidak ada gunanya menggunakan lebih banyak memori dari ini. Ubin latar belakang dapat dengan mudah berada dalam byte yang tidak ditandatangani, karena terdapat kurang dari 256 jenis ubin latar belakang yang berbeda. Lapisan kawat murni biner: salah satu ubin memiliki kawat di dalamnya atau tidak. Jadi itu satu bit per ubin. Dan lapisan furnitur lagi bisa menjadi byte yang tidak ditandatangani, tergantung pada berapa banyak kemungkinan potongan furnitur yang ada.
Total ukuran memori per ubin: 2 byte + 1 byte + 1 bit + 1 byte: 4 byte + 1 bit. Dengan demikian, ukuran total untuk peta Terraria kecil adalah 20790000 byte, atau ~ 20MB. (catatan: perhitungan ini didasarkan pada Terraria 1.1. Permainan telah berkembang banyak sejak saat itu, tetapi bahkan Terraria modern dapat masuk dalam 8 byte per lokasi ubin, atau ~ 40MB. Masih cukup dapat ditoleransi).
Anda seharusnya tidak pernah memiliki representasi ini disimpan sebagai array kelas C #. Mereka harus berupa array bilangan bulat atau yang serupa. AC # struct akan bekerja juga.
Sekarang, ketika tiba saatnya untuk menggambar bagian dari peta (perhatikan penekanannya), Terraria perlu mengubah ubin konseptual ini menjadi ubin yang sebenarnya . Setiap ubin harus benar-benar memilih gambar latar depan, gambar latar belakang, gambar furnitur opsional, dan memiliki gambar kawat. Di sinilah XNA hadir dengan berbagai sprite sheet dan semacamnya.
Yang perlu Anda lakukan adalah mengubah bagian yang terlihat dari peta konseptual Anda menjadi ubin sprite XNA yang sebenarnya. Anda seharusnya tidak mencoba mengubah semuanya sekaligus . Setiap ubin yang Anda simpan seharusnya hanya sebuah indeks yang mengatakan bahwa "Saya ubin tipe X," di mana X adalah bilangan bulat. Anda menggunakan indeks integer itu untuk mengambil sprite mana yang Anda gunakan untuk menampilkannya. Dan Anda menggunakan sprite sheet XNA untuk membuatnya lebih cepat dari sekadar menggambar paha depan individu.
Sekarang wilayah ubin yang terlihat perlu dipecah menjadi berbagai potongan, sehingga Anda tidak terus-menerus membuat lembaran sprite setiap kali kamera bergerak. Jadi Anda mungkin memiliki 64x64 bongkahan dunia sebagai sprite sheet. Potongan 64x64 mana pun di dunia terlihat dari posisi kamera pemain saat ini adalah bidak yang Anda gambar. Setiap potongan lain bahkan tidak memiliki sprite sheet; jika sepotong jatuh dari layar, Anda membuang lembar itu (catatan: Anda tidak benar-benar menghapusnya; Anda menyimpannya dan merespeknya untuk potongan baru yang mungkin akan terlihat kemudian).
Saya ingin seluruh peta diproses setidaknya pada aplikasi server (dan pada klien jika memungkinkan).
Anda Server tidak perlu tahu atau peduli tentang representasi visual dari ubin. Yang perlu diperhatikan hanyalah representasi konseptual. Pengguna menambahkan ubin di sini, sehingga mengubah indeks ubin itu.