Megapack: Kepiye Factorio Ngatasi Masalah Multiplayer 200 Pemain

Megapack: Kepiye Factorio Ngatasi Masalah Multiplayer 200 Pemain
Ing Mei taun iki, aku melu minangka pemain ing Acara MMO KatherineOfSky. Aku ngeweruhi sing nalika nomer pemain tekan nomer tartamtu, saben sawetara menit sawetara wong "mudhun". Begjanipun kanggo sampeyan (nanging ora kanggo kula), Aku salah siji pemain sing kapan waemalah karo sambungan apik. Aku njupuk minangka tantangan pribadi lan wiwit katon kanggo nimbulakΓ© masalah. Sawise telung minggu debug, nguji, lan ndandani, bug kasebut pungkasane didandani, nanging perjalanan kasebut ora gampang.

Masalah ing game multiplier angel banget dilacak. Biasane kedadeyan ing paramèter jaringan sing spesifik lan ing negara game sing spesifik (ing kasus iki, luwih saka 200 pemain). Lan malah nalika masalah bisa maleh, iku ora bisa bener debugged amarga masang breakpoints mandheg game, ngaco timer, lan biasane nimbulaké sambungan kanggo wektu entek. Nanging thanks kanggo ketekunan lan alat apik disebut kikuk Aku bisa ngerteni apa sing kedadeyan.

Ing cendhak, amarga bug lan implementasine ora lengkap saka simulasi negara tundha, klien kadhangkala ketemu dhewe ing kahanan kang kudu ngirim paket jaringan ing siji siklus jam, dumadi saka tumindak pamuter-input kanggo milih kira-kira 400 entitas game ( kita nyebut "megapacket"). Sawise iku, server ora mung kudu nampa kabeh tumindak input kanthi bener, nanging uga ngirim menyang kabeh klien liyane. Yen sampeyan duwe 200 klien, iki cepet dadi masalah. Saluran menyang server kanthi cepet dadi macet, nyebabake paket ilang lan paket sing dijaluk maneh. Nundha tumindak input banjur nyebabake luwih akeh klien miwiti ngirim megapaket, lan longsoran saya tambah kuwat. Klien sing sukses bisa pulih, kabeh liyane tiba.

Megapack: Kepiye Factorio Ngatasi Masalah Multiplayer 200 Pemain
Masalah iki cukup dhasar, lan butuh 2 minggu kanggo ndandani. Iku cukup teknis, mula aku bakal nerangake rincian teknis jus ing ngisor iki. Nanging pisanan, sampeyan kudu ngerti yen wiwit versi 0.17.54, dirilis ing 4 Juni, ing ngadhepi masalah sambungan sauntara, bebarengan wis dadi luwih stabil, lan wektu tundha ndhelikake akeh kurang buggy (kurang braking lan teleporting). Uga, aku wis ngganti cara wektu tundha pertempuran didhelikake, lan muga-muga iki bakal luwih lancar.

Multiplayer Mega Pack - Rincian Teknis

Gampange, multiplier ing game bisa kaya mangkene: kabeh klien nyinkronake kahanan game kanthi nampa lan ngirim mung input pemain (disebut "tindakan input" Tindakan Input). Tugas utama server yaiku nransfer Tindakan Input lan mesthekake yen kabeh klien nindakake tumindak sing padha ing siklus sing padha. Sampeyan bisa maca liyane babagan iki ing kirim. FFF-149.

Wiwit server kudu njupuk pancasan bab tumindak apa, tumindak pamuter ing dalan ing ngisor iki: tumindak pamuter -> klien game -> jaringan -> server -> jaringan -> klien game. Iki tegese saben tumindak pamuter wis dileksanakake mung sawise wis digawe path babak-trip liwat jaringan. Amarga iki, game kasebut bakal katon alon banget, saengga meh sanalika sawise munculake multiplier ing game kasebut, mekanisme kanggo ndhelikake wektu tundha. Latency ndhelikake simulates input pamuter tanpa nimbang tumindak pemain liyane lan nggawe keputusan server.

Megapack: Kepiye Factorio Ngatasi Masalah Multiplayer 200 Pemain
Factorio duwe negara game negara game iku negara lengkap peta, pamuter, entitas, lan kabeh liyane. Punika simulasi deterministik ing kabeh klien adhedhasar tumindak sing ditampa saka server. Negara game iku suci, lan yen wiwit beda saka server utawa klien liyane, banjur desynchronization ana.

kajaba negara game kita duwe negara telat Status Latency. Isine subset cilik saka negara utama. Status Latency ora suci lan mung nggambarake gambar apa kahanan game bakal katon ing mangsa ngarep adhedhasar input saka pamuter Tindakan Input.

Kanggo nindakake iki, kita nyimpen salinan sing digawe Tindakan Input ing antrian tundha.

Megapack: Kepiye Factorio Ngatasi Masalah Multiplayer 200 Pemain
Yaiku, ing pungkasan proses ing sisih klien, gambar katon kaya iki:

  1. nglamar Tindakan Input kabeh pemain kanggo negara game cara tumindak input iki ditampa saka server.
  2. Mbusak kabeh saka antrian wektu tundha Tindakan Input, sing, miturut server, wis diterapake negara game.
  3. Mbusak Status Latency lan ngreset supaya katon persis padha negara game.
  4. Aplikasi kabeh tumindak saka antrian wektu tundha kanggo Status Latency.
  5. Adhedhasar data negara game ΠΈ Status Latency nerjemahake game kanggo pamuter.

Kabeh iki bola-bali ing saben beat.

Banget angel? Aja santai, ora mung kuwi. Kanggo ngimbangi sambungan Internet sing ora bisa dipercaya, kita wis nggawe rong mekanisme:

  • Mlayu ticks: nalika server nemtokaken sing Tindakan Input bakal kaleksanan ing tact saka game, banjur yen wis ora nampa Tindakan Input sawetara pemain (contone, amarga wektu tundha tambah), dheweke ora bakal ngenteni, nanging bakal ngandhani klien iki "Aku ora nganggep sampeyan Tindakan Input, Aku bakal nyoba kanggo nambah ing baris sabanjurΓ©. Iki ditindakake supaya amarga ana masalah karo sambungan (utawa karo komputer) siji pemain, nganyari peta ora alon-alon kanggo wong liya. Iku worth kang lagi nyimak sing Tindakan Input ora digatekake, nanging mung ditundha.
  • Full round-trip latency: Server nyoba kanggo guess apa latensi round-trip antarane klien lan server kanggo saben klien. Saben 5 detik, rembugan wektu tundha anyar karo klien minangka needed (gumantung carane sambungan wis tumindak ing sasi), lan mundhak utawa sudo wektu tundha trip babak patut.

Dhewe, mekanisme iki cukup prasaja, nanging nalika digunakake bebarengan (sing asring kedadeyan karo masalah sambungan), logika kode dadi angel kanggo ngatur lan akeh kasus pinggiran. Kajaba iku, nalika mekanisme iki teka menyang muter, server lan antrian tundha kudu bener ngleksanakake khusus Tindakan Input miturut jeneng StopMovementInTheNextTick. Thanks kanggo iki, ing cilik saka masalah sambungan, karakter ora bakal mbukak dhewe (contone, ing Sepur).

Saiki aku kudu nerangake carane pilihan entitas bisa digunakake. Salah sawijining jinis sing lulus Tindakan Input iku owah-owahan ing negara pilihan saka entitas. Iki ngandhani saben wong entitas sing dilayangake karo mouse. Kaya sing sampeyan ngerteni, iki minangka salah sawijining tumindak input sing paling kerep dikirim dening klien, supaya kanggo ngirit bandwidth, kita wis ngoptimalake supaya bisa njupuk papan sethithik. Iki dileksanakake kaya iki: nalika saben entitas dipilih, tinimbang nyimpen Absolute, koordinat peta tliti dhuwur, nyimpen game kurang tliti relatif nutup kerugian saka pilihan sadurungΓ©. Iki bisa dianggo kanthi apik amarga pilihan mouse biasane kedadeyan banget cedhak karo pilihan sadurunge. Iki nyebabake rong syarat penting: Tindakan Input ora kudu dilewati lan kudu ditindakake kanthi urutan sing bener. Iki syarat sing ketemu kanggo negara game. Nanging wiwit tugas negara latensi ing "katon cukup apik" kanggo pamuter, padha ora wareg ing negara tundha. Status Latency ora njupuk menyang akun akeh kasus borderlinedigandhengake karo skipping jam lan ngganti telat transmisi round-trip.

Sampeyan wis bisa guess ngendi iki arep. Pungkasan, kita wiwit ndeleng panyebab masalah megapackage. Oyod masalah kasebut yaiku logika pilihan entitas gumantung Status Latency, lan negara iki ora tansah ngemot informasi sing bener. Dadi megapacket digawe kaya iki:

  1. Pamuter ngalami masalah sambungan.
  2. Mekanisme kanggo skipping siklus lan ngatur wektu tundha transmisi round-trip teka menyang muter.
  3. Antrian negara tundha ora nyathet mekanisme kasebut. Iki njalari sawetara tumindak dibusak prematur utawa mbukak ing urutan salah, asil ing salah Status Latency.
  4. Pamuter ora masalah sambungan lan simulates nganti 400 siklus kanggo nyekel munggah karo server.
  5. Ing saben siklus, tumindak anyar digawe lan disiapake kanggo dikirim menyang server, ngganti pilihan entitas.
  6. Klien ngirim megapacket saka 400+ owah-owahan pilihan entitas menyang server (lan karo tumindak liyane: nembak negara, mlaku negara, etc. uga nandhang saka masalah iki).
  7. Server nampa 400 tumindak input. Awit iku ora diijini kanggo skip tumindak input siji, iku instruksi kabeh klien kanggo nindakake tumindak iki lan dikirim liwat jaringan.

Ironis yaiku mekanisme sing dirancang kanggo ngirit bandwidth ngasilake paket jaringan gedhe.

Kita wis ngrampungake masalah iki kanthi ndandani kabeh kasus pinggiran nganyari lan tundha dhukungan antrian. Senajan njupuk sawetara wektu, iku worth njaluk iku tengen ing mburi tinimbang gumantung ing hacks cepet.

Source: www.habr.com

Add a comment