Sebagai permulaan, saya memiliki latar belakang yang baik dalam jaringan (perangkat keras, router, ex.) Tetapi sangat sedikit pengetahuan yang melewati dasar-dasar pemrograman jaringan. Ini mungkin tampak seperti pertanyaan bodoh, tapi saya ingin tahu apa yang saya hadapi saat memahami implementasi multi-pemain dalam permainan saya.
Saya menciptakan dunia berbasis ubin, yang dihasilkan melalui 2D Array sederhana. Katakanlah seperti World [100] [100], demi kesederhanaan.
Saat ini, metode render hanya merender petak berdasarkan resolusi jendela, ditambah satu petak (untuk perenderan yang halus selama gerakan.) Tidak peduli seberapa besar dunia, (10x10, 1 juta x 1 juta) rendering tidak cacat dalam kinerja.
Aspek gimnya tidak lebih dari sekadar mengetahui apa yang ada dalam tampilan saat ini (ditampilkan pada layar +1) dan paling banyak BEBERAPA informasi ubin di area sekitar pemain.
Jadi apapun yang dikirim oleh Server tidak akan menjadi informasi ubin lengkap. Ex. Item yang diletakkan di tanah, jenis tanah, pohon, dll. Tidak akan menjadi penting di area di luar tampilan pemain, tetapi hanya akan menjadi apa yang Klien / Pemain perlu ketahui tentang ubin itu. (Contoh 'nama masuk' Ultima Online di mana pemain bisa mengetahui Karakter [pemain atau monster] tepat di luar ubin dalam tampilan yang diberikan.)
Saya tidak tahu banyak tentang jaringan, jadi mungkin ketika saya belajar ini dapat menjawab pertanyaan saya. Namun, saya ingin tahu apakah ini merupakan solusi yang layak atau jika idenya hanya menggelikan.
Informasi yang dikirim akan berukuran sekitar 10x15 ubin, dan setiap ubin menyimpan informasi tentang apa yang ada di ubin. Lebih efisien, semuanya akan menjadi Obyek, di mana ubin memegang semua Objek di ubin. Ex. Ubin [4] [4] memiliki Pedang # 23452, Rock2, Tree5, Player3, Monster4.
Ubin kosong tidak akan mengirim apa pun selain tipe medan [Rumput, Pasir, Air] jika belum dimuat selama Inisialisasi / Beban. Beberapa ubin akan memiliki beberapa benda [Tree2, Sword # 924, Gold, Corpse, Rock3].
Jadi saya tidak dapat membayangkan bahwa ubin akan memiliki banyak informasi untuk dikirim ke Klien dari Server, karena Klien hanya perlu mengetahui Tekstur yang perlu dimuat dan Posisi untuk meletakkannya di layar. Posisinya hanya dua bilangan bulat dan Tekstur menjadi satu bilangan bulat untuk daftar file yang akan dikirim klien.
Paling gila, Server harus mengirim 150 ubin dengan informasi hanya sedikit Objek OnLOAD, dan sejak saat itu hanya pembaruan perubahan ubin (jika ada) dan ubin baru (10 hingga 15 setiap kali pemain bergerak ke suatu arah ) dan arah gerakan untuk karakter di layar (sehingga klien dapat mensimulasikan gerakan halus antara ubin).
Saya berasumsi saya benar dalam berpikir ini adalah jumlah yang sangat rendah dari informasi yang dikirim melalui internet atau di antara rekan-rekan, sehingga seharusnya memiliki sedikit masalah dengan kinerja bahkan melalui koneksi yang lambat? Atau apakah saya begitu bodoh dengan jaringan sehingga pikiran saya akan meledak ketika saya akhirnya membuka buku saya di jaringan multi-pemain?
Jika jumlah informasi yang dikirim antara Klien / Server sangat rendah, apakah lebih masuk akal untuk memuat seluruh Dunia pada Inisialisasi? Atau 'Peta' jika Dunia terlalu besar. Dan setelah LOAD, kirim hanya ubin yang diperbarui?
Saya masih memikirkan bagaimana saya harus menangani data secara khusus. Buku yang saya gunakan sebagai referensi ingin saya memiliki Daftar Tertaut, tempat saya menambah dan menghapus objek, jadi semuanya bool. "Apakah ada Karakter? Apakah ada Pohon?"
Saya sedang memikirkan pendekatan yang berbeda, seperti wadah yang menampung objek, dan logika Server yang hanya mengirim apa yang diperlukan untuk memberi tahu Klien apa yang harus dirender. Mungkin dengan objek yang menyimpan informasi jaringan di dalam dirinya sendiri, yang dikirim ketika dipanggil oleh Server.
Jawaban:
Anda berada di jalur yang benar.
Pertimbangkan Minecraft. Minecraft hanya memuat area (juga disebut bongkahan) segera di sekitar pemain. Ini adalah bagaimana server dapat berjalan tanpa kehabisan memori, dan mengapa klien tidak macet dari lalu lintas jaringan.
Inilah yang harus Anda lakukan. Hanya kirim data yang perlu Anda kirim.
Jika Anda hanya mengirim array 2D ubin IDS, ukuran data bisa sangat rendah, terutama jika Anda memiliki kurang dari 256 jenis ubin yang berbeda. Dalam hal ini, Anda dapat menggunakan satu byte (atau karakter yang tidak ditandai). Jadi jika Anda mengirim ubin 100x100 ke pemain, dan setiap ubin hanya terdiri dari satu byte ... Anda mendapatkan idenya. Tidak banyak data.
Komunitas Minecraft telah melakukan pekerjaan luar biasa dengan mendokumentasikan protokolnya: http://mc.kev009.com/Protocol
http://www.minecraftwiki.net/wiki/Classic_server_protocol
sumber
Biasanya merupakan ide yang baik untuk hanya mengirim informasi kepada klien yang seharusnya ditampilkan kepada pemain. Mengikuti prinsip ini mengurangi lalu lintas jaringan dan mencegah kecurangan.
Tetapi perlu diingat bahwa ketika pemain memindahkan karakter mereka, Anda tentu ingin memulai langkah di sisi klien sebelum menerima konfirmasi dari server untuk membuat permainan tampak lebih lambat dan lebih responsif. Itu mungkin berarti bahwa Anda juga ingin mulai menggulir layar ke area yang belum dimuat. Ini memaksa Anda untuk membiarkan bagian peta ini kosong dan menggantinya dengan dunia yang sebenarnya ketika telah dimuat. Itu akan menjadi pemutus perendaman. Untuk alasan itu, Anda harus melakukan preload area dalam radius tertentu di sekitar layar pemain.
Ukuran area yang dimuat sebelumnya tergantung pada seberapa cepat pemain Anda dapat bergerak dan berapa lama latensi rata-rata mereka.
sumber
Jumlah data yang Anda kirim dari Server ke Klien bisa sangat kecil. Jika hanya ini yang perlu Anda kirim, saya akan dengan keras menyarankan memuat sebanyak yang Anda bisa pada Load, sehingga data yang dibutuhkan semakin sedikit. Jumlah yang dikirim saat memuat akan cukup kecil untuk membenarkan waktu buka, penggunaan memori akan hampir tidak ada kecuali dunia Anda terlalu besar, dan Anda perlu memperbarui hampir tidak ada data sama sekali.
Saya membayangkan Anda juga bisa melakukan beberapa trik rapi untuk mengoptimalkan prediksi lag yang mengkompensasi keterlambatan rata-rata pengalaman pengguna, memungkinkan pergerakan yang dapat diprediksi dengan karakter.
Juga memprioritaskan data yang tidak penting dengan gerakan Karakter dan aksi / reaksi Karakter yang menjadi prioritas utama dapat membantu memastikan bahkan pemain yang lamban sekalipun merasa lag yang sangat kecil.
sumber