(Unity) Solusi jaringan yang dioptimalkan untuk banyak objek bergerak

8

Saat ini saya melakukan proyek yang cukup ambisius. Singkatnya, ini adalah game strategi multipemain waktu nyata yang memiliki mekanisme bakteri.

Pada dasarnya, saya memiliki dua pemain jarak jauh di lingkungan, dan mereka dapat menelurkan unit mirip bakteri yang saling serang dan berlipat ganda, menggandakan diri hingga batas sumber daya tercapai. Ini sering menghasilkan sekitar 200+ objek game yang ditampilkan di layar, masing-masing dengan status dan gerakannya sendiri. Ini kedengarannya buruk, tetapi gameplay lokal melawan bot sebenarnya sangat bagus, dan saya berhasil membuatnya cukup performan.

Namun, masalah muncul ketika saya mencoba jaringan game ini. Saya sudah mencoba mengikuti panduan ini untuk mengimplementasikan fitur ini: http://www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/

Ini menghasilkan pengalaman game yang lambat dan tidak menyenangkan bahkan dengan latensi terbaik. Ini kemungkinan disebabkan oleh harus mengirimkan data pergerakan untuk ratusan unit.

Pertanyaan yang saya ajukan:

Bagaimana saya bisa mengoptimalkan jaringan dan sinkronisasi banyak unit bergerak antara dua klien?

Saya sudah memikirkan satu cara untuk melakukan ini. Setelah memunculkan unit, mereka hanya akan melakukan perjalanan dalam satu arah sampai mereka menabrak sesuatu - mungkin saya bisa mensinkronisasi hanya ketika unit muncul dan ketika mereka berinteraksi dengan objek lain? Apakah ini memiliki banyak manfaat? Apa cara ideal untuk menerapkan ini?

Terima kasih sebelumnya atas tanggapannya!

Rachel Cabot
sumber
Apakah model berbaris kemungkinan menjadi apa yang saya butuhkan? clintonbrennan.com/2013/12/lockstep-implementation-in-unity3d
Rachel Cabot
Saya berada di belakang firewall dan tidak dapat mengakses contoh yang Anda tautkan, tetapi sudahkah Anda mencoba membuat serial hanya objek ID, posisi, dan vektor kecepatan setiap frame? Tergantung seberapa pintar Anda dengan algoritma serialisasi, Anda dapat mengurangi informasi status menjadi 7 byte per objek. Jika Anda memastikan bahwa klien menganggap ID yang hilang dari pembaruan sebagai kematian, dan yang baru sebagai bibit, Anda seharusnya tidak memiliki masalah.
Stephan

Jawaban:

1

Untuk 200+ objek bergerak, Anda pasti ingin membuat permainan Anda terbata-bata. Dengan lockstep, muncul kebutuhan untuk determinisme tetapi itu seharusnya tidak terlalu sulit bagi bakteri (yang dapat disimulasikan dengan tumbukan lingkaran-lingkaran).

Jika Anda tidak keberatan dengan self-plug saya yang tidak tahu malu dan ingin contoh dengan logika jaringan dan simulasi dari permainan lockstep, periksa aset ini secara gratis: https://www.assetstore.unity3d.com/en/#!/ konten / 36206 . Sayangnya, versi itu tidak menyertakan semua kode sumber tetapi merasa bebas untuk meretasnya dengan restu saya;). Berikut adalah video tes awal DPhysics: https://www.youtube.com/watch?v=NEzOghxfMdU .

Inti dari lockstep adalah menyinkronkan input, bukan output. Ini karena dengan simulasi sinkron, satu-satunya hal yang tidak diketahui semua klien adalah input klien lain. Artikel yang Anda tautkan dalam komentar Anda menjelaskannya dengan cukup baik. Saya tidak yakin seberapa dalam Anda ingin saya menjelaskan tentang lockstep, jadi saya akan memotongnya di sini dan memperluas jawaban ini jika Anda memiliki pertanyaan lagi.

Pembaruan: Anggap saja sebagai server otoritatif, kecuali server mengirim input alih-alih keadaan permainan. Karena setiap pemain dapat menghasilkan status permainan untuk dirinya sendiri dari input, tidak perlu server untuk mendistribusikan gamestate.

JPtheK9
sumber
1
Pendekatan ini berpotensi menyebabkan de-sinkronisasi, bahkan jika semuanya deterministik, hanya karena latensi antara input yang dibagikan. Sebagai contoh, ambil permainan di mana pemain mencoba untuk memblokir pergerakan suatu objek dengan menempatkan dinding. Pada layar satu pemain, ia mungkin menghitung waktu penempatan dengan benar, dan objek diblokir. Tetapi replikasi itu ke klien lain mungkin datang terlambat, dan setelah dinding ditempatkan objek telah melewati lokasi itu. Bergantung pada mekanisme gim Anda, Anda mungkin masih perlu mengirim pembaruan "gambaran besar" secara berkala untuk menyinkronkan kembali klien.
Acidictadpole
Poin bagus. Ada 0 potensi desyncing jika ini dilakukan dengan benar. Jika sebuah paket tidak terjawab atau datang sangat terlambat, klien tidak dapat maju ke frame berikutnya - ia harus menunggu sampai paket tersebut tiba untuk mengeksekusi frame saat ini. Bingkai dapat direpresentasikan dengan bilangan bulat. Server mendistribusikan paket yang ditandai dengan integer untuk setiap frame.
JPtheK9
Lihatlah jaringan dan kerangka logika untuk Anda sendiri.
JPtheK9
1
@ JPtheK9 "dia harus menunggu sampai paket tiba untuk menjalankan frame saat ini" Dan bagaimana jika paket itu tidak pernah datang?
Stephan
Minta yang baru.
JPtheK9