Megapack: Factorio 200 Oyunçulu Çox Oyunçu Problemini Necə Həll etdi

Megapack: Factorio 200 Oyunçulu Çox Oyunçu Problemini Necə Həll etdi
Bu ilin may ayında oyunçu kimi iştirak etdim KatherineOfSky MMO Hadisələri. Müşahidə etdim ki, oyunçuların sayı müəyyən rəqəmə çatanda bir neçə dəqiqədən bir bəziləri “düşür”. Xoşbəxtlikdən sizin üçün (ancaq mənim üçün deyil), mən də o oyunçulardan biri idim hər zamanhətta yaxşı əlaqə ilə. Mən bunu şəxsi çağırış kimi qəbul etdim və problemin səbəblərini axtarmağa başladım. Üç həftəlik sazlama, sınaq və düzəltmədən sonra səhv nəhayət düzəldildi, lakin səyahət o qədər də asan olmadı.

Çox oyunçulu oyunlarda problemləri izləmək çox çətindir. Onlar adətən çox xüsusi şəbəkə parametrləri altında və çox xüsusi oyun vəziyyətlərində (bu halda 200-dən çox oyunçu) baş verir. Və hətta problem təkrarlana bilsə belə, onu düzgün şəkildə aradan qaldırmaq mümkün deyil, çünki kəsilmə nöqtələrinin daxil edilməsi oyunu dayandırır, taymerləri pozur və adətən vaxt aşımı səbəbindən əlaqənin vaxt aşımına səbəb olur. Amma əzm və gözəl vasitə adlanan sayəsində yöndəmsiz Nə baş verdiyini anlaya bildim.

Bir sözlə, bir səhv və gecikmə vəziyyətinin simulyasiyasının natamam həyata keçirilməsi səbəbindən müştəri bəzən təxminən 400 oyun obyektini seçmək üçün oyunçunun daxiletmə hərəkətlərindən ibarət bir saat dövründə şəbəkə paketini göndərməli olduğu bir vəziyyətdə tapdı ( biz buna "meqapaket" deyirik). Bundan sonra, server yalnız bütün bu daxiletmə hərəkətlərini düzgün qəbul etməli, həm də bütün digər müştərilərə göndərməlidir. Əgər 200 müştəriniz varsa, bu, tez bir zamanda problemə çevrilir. Serverə gedən kanal tez bir zamanda tıxanır, nəticədə paket itkisi və yenidən tələb olunan paketlərin kaskadı ilə nəticələnir. Daxiletmə əməliyyatlarının təxirə salınması daha çox müştərinin meqapaketlər göndərməyə başlamasına səbəb olur və onların uçqunu daha da güclənir. Müvəffəqiyyətli müştərilər sağalmağı bacarır, qalanları isə yıxılır.

Megapack: Factorio 200 Oyunçulu Çox Oyunçu Problemini Necə Həll etdi
Problem olduqca fundamental idi və onu həll etmək mənə 2 həftə çəkdi. Bu olduqca texnikidir, ona görə də aşağıda şirəli texniki detalları izah edəcəyəm. Ancaq əvvəlcə bilməlisiniz ki, iyunun 0.17.54-də buraxılmış 4 versiyasından bəri, müvəqqəti əlaqə problemləri ilə əlaqədar olaraq, multiplayer daha sabit hala gəldi və gecikmə gizlədilməsi daha az səhvdir (daha az əyləc və teleportasiya). Həmçinin, mən döyüş gecikmələrinin gizlədilməsi üsulunu dəyişdim və ümid edirəm ki, bu, onları bir az hamarlaşdıracaq.

Multiplayer Mega Pack - Texniki Təfərrüatlar

Sadə dillə desək, oyunda multiplayer belə işləyir: bütün müştərilər yalnız oyunçu daxiletməsini ("giriş hərəkətləri" adlanır) qəbul edib göndərməklə oyunun vəziyyətini simulyasiya edirlər. Daxiletmə hərəkətləri). Serverin əsas vəzifəsi ötürməkdir Daxiletmə hərəkətləri və bütün müştərilərin eyni dövrədə eyni hərəkətləri yerinə yetirməsini təmin etmək. Bu barədə daha ətraflı yazıda oxuya bilərsiniz. FFF-149.

Server hansı tədbirlərin görüləcəyi barədə qərar verməli olduğundan, oyunçunun hərəkətləri aşağıdakı yolda hərəkət edir: oyunçu hərəkəti -> oyun müştərisi -> şəbəkə -> server -> şəbəkə -> oyun müştərisi. Bu o deməkdir ki, oyunçunun hər bir hərəkəti yalnız şəbəkədə gediş-gəliş yolu keçdikdən sonra həyata keçirilir. Buna görə oyun olduqca yavaş görünürdü, buna görə də oyunda multiplayer göründükdən dərhal sonra gecikmələri gizlətmək üçün bir mexanizm təqdim edildi. Gecikmə gizlədilməsi digər oyunçuların hərəkətlərini və server qərarlarını nəzərə almadan oyunçu daxiletməsini simulyasiya edir.

Megapack: Factorio 200 Oyunçulu Çox Oyunçu Problemini Necə Həll etdi
Factorio oyun vəziyyətinə malikdir oyun vəziyyəti xəritənin, oyunçunun, obyektlərin və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsaslanaraq bütün müştərilərdə deterministik şəkildə simulyasiya edilir. Oyun vəziyyəti müqəddəsdir və əgər o, serverdən və ya hər hansı digər müştəridən fərqlənməyə başlayırsa, desinxronizasiya baş verir.

Lakin oyun vəziyyəti gecikmə vəziyyətimiz var Gecikmə vəziyyəti. Əsas dövlətin kiçik bir hissəsini ehtiva edir. Gecikmə vəziyyəti müqəddəs deyil və sadəcə oyunçunun daxiletmələrinə əsaslanaraq, oyunun vəziyyətinin gələcəkdə necə görünəcəyinə dair bir şəkil təqdim edir. Daxiletmə hərəkətləri.

Bunu etmək üçün yaradılan bir nüsxəni saxlayırıq Daxiletmə hərəkətləri gecikmə növbəsində.

Megapack: Factorio 200 Oyunçulu Çox Oyunçu Problemini Necə Həll etdi
Yəni müştəri tərəfində prosesin sonunda şəkil belə görünür:

  1. Müraciət edin Daxiletmə hərəkətləri bütün oyunçular üçün oyun vəziyyəti bu giriş hərəkətlərinin serverdən alınma yolu.
  2. Gecikmə növbəsindən hər şeyi silin Daxiletmə hərəkətləri, serverə görə, artıq tətbiq edilib oyun vəziyyəti.
  3. Sil Gecikmə vəziyyəti və tam olaraq eyni görünməsi üçün onu sıfırlayın oyun vəziyyəti.
  4. Gecikmə növbəsindən tutmuş bütün hərəkətləri tətbiq edin Gecikmə vəziyyəti.
  5. Məlumatlara əsasən oyun vəziyyəti и Gecikmə vəziyyəti oyunu oyunçuya təqdim edin.

Bütün bunlar hər ölçüdə təkrarlanır.

Çox çətin? Rahat olmayın, bu, hamısı deyil. Etibarsız İnternet bağlantılarını kompensasiya etmək üçün biz iki mexanizm yaratdıq:

  • Atlanmış gənələr: server buna qərar verdikdə Daxiletmə hərəkətləri o, almamışsa, onda oyunun taktikasında icra olunacaq Daxiletmə hərəkətləri bəzi oyunçu (məsələn, gecikmənin artması səbəbindən) gözləməyəcək, lakin bu müştəriyə məlumat verəcəkdir: "Mən sizi nəzərə almadım. Daxiletmə hərəkətləri, Mən onları növbəti panelə əlavə etməyə çalışacağam. Bu, bir oyunçunun əlaqəsi (və ya kompüteri ilə) ilə bağlı problemlər səbəbindən xəritə yeniləməsinin hər kəs üçün yavaşlamaması üçün edilir. Bunu qeyd etmək yerinə düşər Daxiletmə hərəkətləri göz ardı edilmir, sadəcə olaraq təxirə salınır.
  • Tam gediş-gəliş gecikməsi: Server hər bir müştəri üçün müştəri və server arasında gediş-gəliş gecikməsinin nə olduğunu təxmin etməyə çalışır. Hər 5 saniyədən bir, ehtiyac olduqda müştəri ilə yeni gecikmə barədə danışıqlar aparır (keçmişdə əlaqənin necə davranmasından asılı olaraq) və gediş-gəliş gecikməsini müvafiq olaraq artırır və ya azaldır.

Öz-özünə bu mexanizmlər olduqca sadədir, lakin birlikdə istifadə edildikdə (bu, tez-tez əlaqə problemləri ilə baş verir), kod məntiqini idarə etmək çətinləşir və bir çox kənar hallar olur. Bundan əlavə, bu mexanizmlər işə düşdükdə, server və gecikmə növbəsi düzgün bir şəkildə xüsusi həyata keçirməlidir Giriş Fəaliyyəti deyilən Sonrakı Tikdə Hərəkəti dayandırın. Bunun sayəsində, əlaqə problemləri halında, xarakter öz-özünə qaçmayacaq (məsələn, bir qatarın altında).

İndi mən sizə qurum seçiminin necə işlədiyini izah etməliyəm. Keçmiş növlərdən biri Giriş Fəaliyyəti obyektin seçim vəziyyətində dəyişiklikdir. O, hər kəsə oyunçunun siçan ilə hansı obyektin üzərinə getdiyini bildirir. Gördüyünüz kimi, bu, müştərilər tərəfindən göndərilən ən çox daxiletmə əməliyyatlarından biridir, ona görə də bant genişliyinə qənaət etmək üçün onu mümkün qədər az yer tutması üçün optimallaşdırdıq. Bu, belə həyata keçirilir: hər bir obyekt seçildikdə, mütləq, yüksək dəqiqlikli xəritə koordinatlarını saxlamaq əvəzinə, oyun əvvəlki seçimdən aşağı dəqiqlikli nisbi ofset saxlayır. Bu yaxşı işləyir, çünki siçan seçimi adətən əvvəlki seçimə çox yaxın olur. Bu, iki vacib tələbi ortaya qoyur: Daxiletmə hərəkətləri heç vaxt atlanmamalı və düzgün ardıcıllıqla edilməlidir. Bu tələblər yerinə yetirilir oyun vəziyyəti. Amma vəzifədən bəri gecikmə vəziyyəti oyunçu üçün "kifayət qədər yaxşı görünməkdə" gecikmə vəziyyətindən məmnun deyillər. Gecikmə vəziyyəti nəzərə almır çoxlu sərhəd hallarısaatların atlanması və gediş-gəliş ötürülməsi gecikmələrinin dəyişdirilməsi ilə bağlıdır.

Bunun hara getdiyini artıq təxmin edə bilərsiniz. Nəhayət, meqapaket probleminin səbəblərini görməyə başlayırıq. Problemin kökü varlığın seçilməsi məntiqinin əsaslanmasıdır Gecikmə vəziyyəti, və bu vəziyyət həmişə düzgün məlumatı ehtiva etmir. Beləliklə, meqapaket belə yaradılır:

  1. Oyunçu əlaqə problemi yaşayır.
  2. Dövrləri atlamaq və gediş-gəliş ötürmə gecikməsini tənzimləmək mexanizmləri işə düşür.
  3. Gecikmə vəziyyəti növbəsi bu mexanizmləri nəzərə almır. Bu, bəzi hərəkətlərin vaxtından əvvəl silinməsinə və ya səhv ardıcıllıqla icra edilməsinə səbəb olur, nəticədə səhv Gecikmə vəziyyəti.
  4. Pleyerin heç bir əlaqə problemi yoxdur və serveri tutmaq üçün 400 dövrə qədər simulyasiya edir.
  5. Hər bir dövrədə yeni bir hərəkət yaradılır və obyekt seçimini dəyişdirərək serverə göndərilməyə hazırlanır.
  6. Müştəri serverə 400+ obyekt seçimi dəyişikliklərindən ibarət meqapaket göndərir (və digər hərəkətlərlə: atəş vəziyyəti, gediş vəziyyəti və s. də bu problemdən əziyyət çəkir).
  7. Server 400 giriş hərəkəti qəbul edir. Bir giriş hərəkətini atlamağa icazə verilmədiyi üçün bütün müştərilərə bu hərəkətləri yerinə yetirməyi tapşırır və onları şəbəkə üzərindən göndərir.

İroni odur ki, bant genişliyinə qənaət etmək üçün hazırlanmış mexanizm nəhəng şəbəkə paketləri ilə nəticələndi.

Biz bütün yeniləmə kənar halları və gecikmə növbəsi dəstəyini düzəltməklə bu problemi həll etdik. Bu kifayət qədər vaxt tələb etsə də, sürətli hacklərə güvənməkdənsə, sonunda onu düzgün əldə etməyə dəyərdi.

Mənbə: www.habr.com

Добавить комментарий