Megapack: Kumaha Factorio Ngarengsekeun Masalah Multiplayer 200-Pamaén

Megapack: Kumaha Factorio Ngarengsekeun Masalah Multiplayer 200-Pamaén
Dina Méi taun ieu kuring milu salaku pamuter di acara MMO KatherineOfSky. Kuring noticed nu lamun jumlah pamaén ngahontal jumlah nu tangtu, unggal sababaraha menit sababaraha di antarana "ragrag". Kabeneran keur anjeun (tapi teu keur kuring), Kuring éta salah sahiji jalma pamaén anu dipegatkeun unggal waktos, malah ku sambungan alus. Kuring nyandak ieu salaku tantangan pribadi sareng mimiti milarian panyabab masalahna. Saatos tilu minggu debugging, nguji, sareng ngalereskeun, bug tungtungna dibenerkeun, tapi perjalananna henteu gampang.

Masalah sareng kaulinan multiplayer hésé pisan dilacak. Aranjeunna biasana lumangsung dina parameter jaringan pisan husus sarta kaayaan kaulinan pisan husus (dina hal ieu, ngabogaan leuwih ti 200 pamaén). Komo lamun masalahna bisa dihasilkeun, teu bisa debugged leres sabab inserting breakpoints eureun game, confuses timers, sarta biasana ngabalukarkeun sambungan kana waktu kaluar. Tapi berkat kegigihan sarta alat éndah disebut karagok Kuring junun manggihan naon anu lumangsung.

Pondokna, alatan bug jeung palaksanaan teu lengkep tina simulasi kaayaan latency, klien kadang bakal manggihan sorangan dina situasi dimana eta kudu ngirim pakét jaringan diwangun ku lampah pilihan input pamuter urang ngeunaan 400 entitas kaulinan dina hiji siklus jam ( urang nelepon ieu "mega-pakét"). Server kedah teras henteu ngan ukur nampi sadaya tindakan input ieu kalayan leres, tapi ogé ngirimkeunana ka sadaya klien anu sanés. Upami Anjeun gaduh 200 klien, ieu gancang jadi masalah. Link ka server gancang jadi clogged, ngabalukarkeun pakét leungitna sarta cascade tina ulang dipénta pakét. Nunda tindakan input teras nyababkeun langkung seueur klien ngirim megapakét, nyababkeun longsoran janten langkung ageung. Klién anu untung tiasa pulih; sadayana anu sanésna murag.

Megapack: Kumaha Factorio Ngarengsekeun Masalah Multiplayer 200-Pamaén
Masalahna rada dasar sareng kuring peryogi 2 minggu pikeun ngalereskeunana. Ieu geulis teknis, jadi kuring bakal ngajelaskeun rinci teknis juicy handap. Tapi ke heula, anjeun kudu nyaho yén saprak versi 0.17.54, dirilis dina 4 Juni, dina nyanghareupan masalah sambungan samentara, multiplayer geus jadi leuwih stabil, sarta nyumputkeun reureuh geus jadi loba kurang buggy (kurang slowdown na teleporting). Kuring ogé parantos ngarobih cara lag tempur disumputkeun sareng kuring ngarepkeun ieu bakal langkung lancar.

Multiplayer Mega Pack - Rincian Téknis

Sacara basajan, multiplayer dina kaulinan jalan kawas kieu: kabéh klien simulate kaayaan kaulinan, narima jeung ngirim ukur input pamuter (disebut "aksi input", Tindakan Input). Tugas utama server nyaéta mindahkeun Tindakan Input tur kadalikeun yén sadaya klien ngalakukeun tindakan anu sami dina siklus jam anu sami. Anjeun tiasa maca langkung seueur ngeunaan ieu dina postingan FFF-149.

Kusabab server kudu nyieun kaputusan ngeunaan naon lampah nedunan, lampah pamuter urang mindahkeun kira sapanjang jalur ieu: Peta pamuter -> klien kaulinan -> jaringan -> server -> jaringan -> klien kaulinan. Ieu ngandung harti yén aksi unggal pamuter urang dipigawé ngan sanggeus nyieun round trip sakuliah jaringan. Kusabab ieu, kaulinan bakal sigana sangar slow, jadi ampir langsung saatos bubuka multiplayer di buruan, mékanisme diwanohkeun pikeun nyumputkeun reureuh. Nyumput reureuh simulates input pamuter tanpa nyokot kana akun lampah pamaén séjén sarta kaputusan server urang.

Megapack: Kumaha Factorio Ngarengsekeun Masalah Multiplayer 200-Pamaén
Factorio boga kaayaan kaulinan Nagara kaulinan nyaeta kaayaan lengkep kartu, pamaén, éntitas jeung sagalana sejenna. Ieu deterministically simulated dina sakabéh klien dumasar kana lampah nampi ti server. Kaayaan kaulinan suci, sareng upami éta mimiti béda ti server atanapi klien anu sanés, desync lumangsung.

kajabi Nagara kaulinan urang boga kaayaan reureuh Kaayaan Latency. Ieu ngandung sawaréh leutik tina kaayaan taneuh. Kaayaan Latency teu suci tur saukur ngagambarkeun gambar naon kaayaan kaulinan bakal kasampak kawas dina mangsa nu bakal datang dumasar kana inputs pamaén Tindakan Input.

Pikeun tujuan ieu, urang nyimpen salinan nu dijieun Tindakan Input dina antrian reureuh.

Megapack: Kumaha Factorio Ngarengsekeun Masalah Multiplayer 200-Pamaén
Nyaéta, dina ahir prosés di sisi klien, gambar sapertos kieu:

  1. Urang ngalamar Tindakan Input kabéh pamaén pikeun Nagara kaulinan cara tindakan input ieu ditampi ti server.
  2. Urang miceun sagalana ti antrian reureuh Tindakan Input, nu, nurutkeun server, geus dilarapkeun ka Nagara kaulinan.
  3. Mupus Kaayaan Latency tur ngareset eta sangkan eta Sigana persis sarua jeung Nagara kaulinan.
  4. Urang nerapkeun sagala lampah ti antrian reureuh ka Kaayaan Latency.
  5. Dumasar data Nagara kaulinan и Kaayaan Latency Urang ngajadikeun kaulinan pikeun pamaén.

Sadaya ieu diulang dina unggal ukuran.

Hese teuing? Tong santai, ieu sanés sadayana. Pikeun ngimbangan sambungan Internét anu teu dipercaya, kami parantos nyiptakeun dua mékanisme:

  • Ticks lasut: lamun server mutuskeun yén Tindakan Input bakal dieksekusi dina ngéléhkeun game, lajeng lamun anjeunna henteu nampi Tindakan Input sababaraha pamaén (contona, alatan hiji ngaronjat reureuh), anjeunna moal antosan, tapi bakal ngawartosan klien ieu "Kuring henteu tumut kana akun anjeun. Tindakan Input, Abdi badé nambihanana dina bar salajengna." Hal ieu dilakukeun ku kituna alatan masalah sambungan (atawa komputer) hiji pamuter, update peta teu ngalambatkeun turun for everyone sejenna. Eta sia noting yén Tindakan Input teu dipaliré, tapi ngan saukur disisihkeun.
  • Latency round-trip pinuh: Server nyoba nebak naon latensi round-trip antara klien sareng server pikeun tiap klien. Unggal 5 detik, éta negotiates latency anyar jeung klien lamun perlu (dumasar kana kumaha sambungan geus behaved nu geus kaliwat), sarta nambahan atawa ngurangan latency babak-lalampahan sasuai.

Dina sorangan, mékanisme ieu cukup basajan, tapi nalika aranjeunna dipaké babarengan (anu mindeng lumangsung kalawan masalah sambungan), logika kode jadi hésé pikeun ngatur sarta kalawan loba kasus ujung. Salaku tambahan, nalika mékanisme ieu dimaénkeun, server sareng antrian reureuh kedah leres ngalaksanakeun khusus Aksi Input ngaranna StopMovementInTheNextTick. Hatur nuhun kana ieu, lamun aya masalah sareng sambungan, karakter moal ngajalankeun on sorangan (contona, di hareup karéta).

Ayeuna urang kedah ngajelaskeun ka anjeun kumaha pilihan éntitas jalan. Salah sahiji jinis anu dikirimkeun Aksi Input nyaéta parobahan dina kaayaan pilihan éntitas. Éta nyarioskeun ka sadayana éntitas mana anu dipayunkeun ku pamaén. Sakumaha anjeun tiasa bayangkeun, ieu mangrupikeun salah sahiji tindakan input anu paling umum anu dikirim ku klien, janten pikeun ngahémat bandwidth, kami parantos ngaoptimalkeun éta pikeun nyandak sakedik rohangan. Cara gawéna nyaéta salaku unggal éntitas dipilih, tinimbang nyimpen mutlak, koordinat peta-precision tinggi, kaulinan nyimpen hiji low-precision relatif offset ti Pilihan saméméhna. Ieu tiasa dianggo saé kusabab pamilih beurit condong caket pisan sareng pilihan sateuacana. Ieu raises dua sarat penting: Tindakan Input Aranjeunna teu kedah dilewati sareng kedah réngsé dina urutan anu leres. sarat ieu kaeusi pikeun Nagara kaulinan. Tapi saprak tugas Kaayaan latency dina "pilari cukup alus" pikeun pamaén, aranjeunna henteu wareg dina kaayaan reureuh. Kaayaan Latency teu tumut kana akun loba kasus tepi, pakait sareng skipping siklus jam jeung ngarobah round-trip telat transmisi.

Anjeun geus bisa nebak dimana ieu bade. Kami tungtungna mimiti ningali alesan pikeun masalah megapack. Akar masalahna nyaéta yén logika pilihan éntitas ngandelkeun Kaayaan Latency, sareng kaayaan ieu henteu salawasna ngandung inpormasi anu leres. Janten, megapacket dihasilkeun sapertos kieu:

  1. Pamuter boga masalah sambungan.
  2. Mékanisme pikeun ngaluncat siklus jam sareng ngatur tunda pangiriman babak-perjalanan dimaénkeun.
  3. Antrian kaayaan reureuh teu nyandak mékanisme ieu kana rekening. Ieu nyababkeun sababaraha tindakan dihapus sateuacanna atanapi dilakukeun dina urutan anu salah, nyababkeun salah Kaayaan Latency.
  4. pamuter ngabogaan masalah sambungan na, guna nyekel up kalawan server, simulates nepi ka 400 siklus.
  5. Dina unggal centang, aksi anyar, ngarobah pilihan éntitas, dihasilkeun sarta disiapkeun pikeun ngirim ka server.
  6. Klién ngirimkeun mega-angkatan 400+ parobahan pilihan éntitas ka server (sareng sareng tindakan sanésna: nagara shooting, nagara leumpang, jsb ogé ngalaman masalah ieu).
  7. Server nampi 400 tindakan input. Kusabab teu diidinan ngalangkungan tindakan input, éta maréntahkeun sadaya klien pikeun ngalakukeun tindakan éta sareng ngirimkeunana ka jaringan.

Ironisna nyaéta mékanisme anu dirancang pikeun ngahémat rubakpita réngsé nyiptakeun pakét jaringan anu ageung.

Kami ngabéréskeun masalah ieu ku ngalereskeun sadaya kasus pangénggalan pembaruan sareng dukungan antrian backlog. Sanajan butuh waktu rada saeutik, dina tungtungna éta patut meunang eta katuhu tinimbang ngandelkeun hacks gancang.

sumber: www.habr.com

Tambahkeun komentar