Apakah layak bagi Server untuk mengirim tidak lebih dari area berbasis ubin ke Klien?


8

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.


Saya sarankan Anda melihat freemmorpgmaker.com, mesin ini banyak membantu saya ketika saya baru mulai. Script ini relatif sederhana dan menyenangkan untuk dikerjakan. Kode itu mengajari saya segala yang perlu saya ketahui untuk membuat mesin / game 2D saya sendiri. Apa yang seharusnya tidak Anda pelajari dari mereka adalah bagaimana mengamankan server / klien Anda.
Nick

Jawaban:


6

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.

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?

Inilah yang harus Anda lakukan. Hanya kirim data yang perlu Anda kirim.

  1. Ketika klien bergabung, kirimkan sepotong peta ubin (atau semua jika, jika Anda berurusan dengan area kecil)
  2. Ketika pemain mencoba memodifikasi ubin, kirim data itu ke server.
  3. Ketika ubin berubah status, kirim paket dengan informasi itu ke semua klien yang relevan.

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


1
wow, terima kasih banyak! Ini adalah dorongan kepercayaan diri yang besar bahwa saya diberi tahu bahwa saya berada di jalur yang benar, ketika saya tahu sangat sedikit. Ini memberi tahu saya bahwa saya memahami segala sesuatunya dengan benar dan merekayasa sebaik mungkin. Saya yakin bahwa jika saya terus belajar, saya akan melakukan cukup. Sangat memuaskan mendengar saran positif, dan tidak, "Anda melakukan kesalahan!" lol :)

Butuh waktu lama sebelum saya mengumpulkan keberanian untuk mengambil game multi pemain dan 3D. :)
Nick Caplinger

Juga, saran positif adalah apa yang berkembang di komunitas ini. Saya mendorong semua orang untuk berkontribusi dengan cara apa pun yang mereka bisa!
Nick Caplinger

3

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.


-1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.