Apakah objek besar dan statis seperti lingkungan ditransmisikan dari server ke klien dalam game multi-pemain modern?


18

Saya memiliki sistem otoritatif, di mana ketika pemain bergabung dengan pertandingan, ia mendapatkan semua benda yang telah muncul - muncul pada dirinya sendiri (klien).

Ini terlihat seperti ini:

  1. Client mengirim token akses ke Server
  2. Client menerima penerimaan dari Server
  3. Client beralih adegan ke adegan game
  4. Servermengirimkan pemain, peti, objek yang dapat berinteraksi dengan Anda sehingga clientdapat memunculkan dan menampilkannya.

Tapi bagaimana dengan objek dasarnya? Untuk saat ini, saya memiliki adegan yang sama persis di server dan klien - dengan satu pesawat statis yang bertindak sebagai lantai. Saat ini saya sedang menambahkan barang baru, pohon, tangga dan membangun bersama.

Saya pikir - kita baik-baik saja. Tetapi bukankah seharusnya lingkungan disinkronkan juga? Menjadi jaringan entah bagaimana? Dimiliki oleh server?

Mari kita ambil League of Legends:

masukkan deskripsi gambar di sini

Ini adalah lingkungan yang statis, mungkin satu gabungan mesh (tangga, rumput, dinding, toko). Tetapi apakah itu benar-benar disimpan di klien atau dikirim oleh server selama layar memuat?


1
Anda bahkan dapat memikirkannya sejak Anda dapat menambahkan skin khusus ke karakter dan lingkungan liga. Anda tidak mengirim mereka untuk memutuskan, mereka ditampilkan secara lokal, jadi masuk akal untuk menyimpulkan bahwa mereka disimpan dan dirender secara lokal. Juga, mereka tidak mempengaruhi gameplay, jika Anda bertanya tentang tabrakan, mereka adalah campuran dari server dan klien, sehingga pemain tidak bisa menipu dan melewati dinding.
Candid Moon _Max_

Jawaban:


41

Sebagian besar, tidak, aset seni dalam bentuk apa pun tidak secara rutin dikirim melalui jaringan. Umumnya semua klien akan memiliki aset konten yang sama secara lokal. Mungkin ada kode untuk memastikan hal ini terjadi melalui pengecekan konten, atau serupa. Jika Anda khawatir tentang pengguna yang merusak beberapa sisi klien konten mereka, Anda dapat menerapkan sistem serupa.

Server mungkin mengirim arahan ke klien yang menunjukkan bahwa ia harus menampilkan atau menyembunyikan aset tertentu, tetapi tidak akan mengirim data aktual dari aset tersebut. Dalam praktiknya, ini terlalu boros dan lambat, dan dapat menyebabkan masalah nyata dengan orang-orang yang memiliki data terbatas.

Dalam kasus tertentu, aset yang lebih kecil dapat dialirkan secara keseluruhan jika aset tersebut entah bagaimana dianggap sebagai "spoiler" atau apa pun. Tapi itu tidak biasa. Secara umum yang Anda lihat adalah gim mungkin mengunduh konten baru dari tambalan, atau apa pun, tetapi itu hanya akan terjadi sekali, selama proses penambalan saat startup. Tidak selama bermain game.


21
Perhatikan bahwa jawaban ini hanya membahas aset statis. Aset dinamis / pemain yang dihasilkan (mis. Potongan dunia Minecraft, atau logo serikat MMORPG yang dapat diunggah pemain) harus ditransmisikan. Tetapi meskipun begitu seseorang biasanya mencoba untuk meminimalkan jumlah data yang diperlukan (untuk melanjutkan contoh Minecraft: mengirim pembaruan blok bukan seluruh potongan, hanya menunjukkan jenis blok / negara dan mengkoordinasikan yang berubah) dan / atau menyimpan data di sisi klien .
hoffmale

@offmale Ya, poin bagus; pertanyaannya menyebutkan lanskap itu statis pada akhirnya, jadi saya tidak berpikir untuk mengangkat titik itu, tapi itu bagus.

3
Jika suatu aset adalah spoiler, biasanya aset itu ada di klien, dienkripsi, dan kunci dekripsi ditransmisikan dari server ke klien ketika aset itu diperlukan.
Grant Davis

4
Dan misalnya jika Anda perlu menempatkan pohon secara acak di peta, alih-alih mengirim koordinat pohon ke klien, ia mengirim benih (dari generator nomor acak) ke klien.
Grant Davis

5

Tergantung pada beberapa faktor, termasuk jenis permainan (saya akan menganggap RTS di sini, meskipun MMO dunia terbuka juga muncul di benak). Keadaan dasar pangkalan, ke pemain lokal dikirim pada saat terhubung, atau merupakan bagian dari aset klien - pikirkan sebuah game RTS di mana peta dikirimkan bersama dengan klien, atau diunduh sebelum game dimulai.

Memang, mesh biasanya tidak akan dikirim, karena sudah pada klien dalam kebanyakan kasus RTS. Apakah peta tabrakan, yang merupakan hal yang sangat penting untuk menjaga sinkronisasi keduanya dikirim, adalah pertanyaan lain. Tetapi di sebagian besar RTS, ini lagi akan disimpan sebelumnya pada klien.

Jadi sungguh, itu semua tergantung pada apa yang RTS kirim, apakah Anda mengunduh peta sebelum waktu bermain, atau pada saat permainan dimulai.

Setelah itu, ada beberapa cara khas untuk tetap disinkronkan:

  • Delta dikirim ke klien - cara paling umum dan efisien untuk menjaga dunia / klien lokal tetap up to date dengan server;
  • Checksum kadang-kadang dikirim baik dari server ke klien atau klien ke server untuk memastikan bahwa negara dunia memang cocok;
  • Kadang-kadang, keadaan penuh tidak disukai untuk menyinkronkan kembali klien - seringkali karena masalah teknis seperti penyimpangan titik mengambang.

4

Mengenai pertanyaan persis seperti yang Anda tanyakan, saya tidak tahu bagaimana League of Legends secara khusus menanganinya. Saya belum pernah memainkan game itu, jadi saya tidak bisa menyarankan apakah perlu atau tidak.

Tetapi jawaban untuk pertanyaan Anda, secara umum, cukup sederhana dan langsung:

Jika datanya statis , dan Anda tahu pasti bahwa itu tidak akan pernah berubah (singkat dari pembaruan permainan penuh berkala, tetapi itu terpisah), lalu mengapa Anda ingin mengirim data tambahan itu? Biasanya Anda mencoba menghindari pengiriman apa pun yang bisa dihindari. Kirimkan data hanya jika komunikasi itu diperlukan .

Di sisi lain, jika data akan berubah seiring waktu , atau jika Anda hanya ingin membiarkan opsi itu terbuka, apakah Anda benar-benar punya pilihan dalam masalah ini? Untuk kasus ini, Anda harus mengirim data. Kalau tidak, klien tidak memiliki apa yang dibutuhkannya.

Ini berlaku untuk semua komunikasi jaringan, bukan hanya data terrain. Semuanya .


2

Tidak.

Saya telah melakukan hal yang adil tentang menggali sumber League of Legends, dan semuanya, termasuk model Champion, Penjaga Toko, latar belakang peta umum, dan makhluk halus yang ditambahkan setelah fakta (seperti tupai kecil di bebatuan dan siput di sungai) disimpan di sisi klien. Fakta bahwa klien memiliki semua model ini adalah salah satu alasan LoL banyak gigabytes.

Mentransfer semua data ini dari server ke klien akan menjadi neraka, belum lagi mengunyah melalui penggunaan bandwidth hanya untuk melakukan semuanya lagi di game berikutnya.

Jadi bagaimana cara mengatasinya? Setiap pemain HANYA mengirimkan data yang penting bagi pemain lain dalam permainan ke server. Tidak ada yang perlu tahu apakah Anda memiliki 5 detik tersisa pada cooldown Q, atau bahwa Deep Thror Skin Thresh menciptakan gelembung untuk Anda. Hal-hal yang bisa diteruskan dalam game adalah hal-hal seperti, Vel'Koz yang dicor Q, Viktor pindah ke kiri, dll ...

Lebih eksplisit lagi, terkait dengan pemuatan layar, saat Anda membahasnya, hal-hal yang terjadi ada hal-hal seperti tambalan tengah, yang setiap pemain perlu bicarakan dengan server kerusuhan sebelum permainan dimulai, jabat tangan koneksi yang aman, dan protokol anti curang.

CATATAN:

Jika Anda ingin melihat-lihat barang apa yang dimiliki klien, dan oleh karena itu, server tidak memberikan Anda, temukan folder C: \ Riot Games \ RADS \ lol_Game_Client \ Projects (yang mungkin sedikit tidak aktif, maafkan saya, saya ' m sedang tidak berfungsi memori sekarang) dan temukan file .RAF unpacker online. Kemudian Anda dapat melihat semua barang yang disimpan secara lokal seperti memuat percikan layar dan tekstur kulit, bahkan kerangka juara.


1
Sepertinya cara yang jelas untuk mengimplementasikan ini adalah memiliki permintaan klien (dari server aset khusus) setiap aset yang belum disimpan secara lokal, dan ketika menerimanya, ia menambahkannya (semi) secara permanen ke toko persisten lokal pada disk. Dengan cara itu, aset hanya diunduh satu kali, dan hanya saat mereka benar-benar dibutuhkan. (Setelah berhasil, optimasi akan dilakukan untuk mengisi lebih dulu toko lokal klien dengan aset yang sangat mungkin diperlukan. Ini akan mengurangi waktu startup game pada koneksi pertama, dengan biaya membuat paket installer game lebih besar)
Jeremy Friesner

1
@JeremyFriesner Mengapa itu menjadi cara yang jelas? Itu terdengar lebih buruk daripada implementasi saat ini yang diuraikan dalam posting ini, yang telah Anda instal semua aset sebelumnya sehingga Anda segera memilikinya saat Anda membutuhkannya. Ini mungkin berhasil untuk permainan pemain tunggal, meskipun saya pikir banyak orang lebih suka waktu instalasi yang lebih lama (dan lebih banyak penggunaan ruang disk) daripada harus terus menunggu aset baru untuk diunduh saat bermain.
Anthony Grist

2
Untuk game multi-pemain? Bencana absolut. Anda tidak ingin membuat setiap pemain lain menunggu untuk memulai permainan karena satu orang harus mengunduh beberapa aset yang belum pernah mereka butuhkan sampai sekarang.
Anthony Grist

1
@AnthonyGrist Itulah sebabnya banyak game seperti liga legenda membutuhkan pemain agar semua aset gim diunduh sebelum bergabung dalam antrian untuk menemukan kecocokan. Ini bekerja jauh lebih baik daripada memiliki kelambatan permainan saat Anda menunggu aset besar akan bekerja. Perlu diingat bahwa dalam genera permainan ini, para pemain merasa senang dengan pengurangan 10 ms dalam ping dan sering bermain dengan <50 ms dari ping dan dapat mengetahui apakah itu melompat ke kisaran 100 hingga 150. Menunggu untuk mengambil aset selama pertandingan akan menjadi bencana di MOBA atau FPS, dan jika itu terjadi pada waktu yang salah, itu bahkan dapat mengubah hasil pertandingan.
JustWannaFly

@AnthonyGrist (lanjutan) Saya kira Anda bisa memikirkannya seperti ini. Dalam beberapa permainan multipemain / kompetitif, pemain menukar waktu pemuatan / penambalan / pemasangan yang lebih lama dengan pengalaman bermain game yang lebih nyata dengan meminta klien mengurus semua pembaruan dan masuknya antrian. Ini membuatnya jadi hanya pemain tertentu yang membutuhkan aset yang harus menunggu kecuali jika dia ingin bergabung dengan partai premade, maka semua pemain dalam partai harus menunggu untuk masuk ke antrian untuk menemukan lawan
JustWannaFly

1

Contoh di mana ini tidak dilakukan adalah Elder Scrolls Online, di mana ia mempercayai klien tentang ketinggian permukaan tanah .

Penambang emas turun beberapa meter dari permukaan tanah. Mereka kemudian bisa berjalan "di bawah" medan, dan menambang sumber daya dari bawah tanpa terlihat oleh PC atau diserang oleh NPC.

Suntingan yang serupa memungkinkan mereka untuk menghaluskan tebing sehingga mereka bisa berjalan di atasnya, menghapus atau merutekan di bawah dinding statis, melihat semua benda statis, dll.

Pada dasarnya, server mempercayai klien tentang lokasi pemain, menghitung tabrakan di sisi server untuk setiap pemain tunggal terhadap semua statika akan sangat berat.

Namun, dalam permainan berbasis ubin seperti Furcadia, itu berbeda: setiap kotak yang Anda pindahkan memiliki walkabilty sisi-server, dan server tidak perlu memercayai klien untuk apa pun: server mengetahui dan memvalidasi setiap gerakan dan tindakan pengguna, dan klien hanya menampilkan tindakan ketika server memberitahukan hasilnya.


1
TL; DR: Selalu berasumsi bahwa klien adalah penipu, curang, pengecut . Tetapi validasi server dari segalanya menurunkan kapasitas Anda.
Draco18s
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.