Mega paket: Factorio-nun inkişaf etdiriciləri 200 oyunçulu çox oyunlu problemindən necə xilas oldular

Mega paket: Factorio-nun inkişaf etdiriciləri 200 oyunçulu çox oyunlu problemindən necə xilas oldular
Bu ilin may ayında mən oyunçu kimi iştirak etdim KatherineOfSky MMO tədbirində. Fərq etdim ki, oyunçuların sayı müəyyən bir sayına çatdıqda, hər bir neçə dəqiqədən bir hissəsi "bağlanır". Şansınız üçün (amma mənim üçün yox), mən o oyunçulardan biri idim ki, hər dəfə bağlanırdım hər dəfə, hətta yaxşı bir bağlantım olmasına baxmayaraq. Bunu şəxsi bir çağırış kimi qəbul etdim və problemi tapmağa başladım. Üç həftəlik debug, test və düzəlişdən sonra səhv nəhayət aradan qaldırıldı, ancaq bu səyahət o qədər də asan olmadı.

Çox oyunçu oyunlarının problemlərini izləmək olduqca çətindir. Adətən, onlar müəyyən şəbəkə parametrlərində və çox spesifik oyun vəziyyətlərində (bu halda - 200-dən çox oyunçu olması) baş verir. Və problemi təkrarlamağı bacardıqda belə, onu düzgün debug etmək mümkün olmur, çünki yoxlama nöqtələrinin qoyulması oyunu dayandırır, zamanlayıcıları qarışdırır və adətən vaxt aşımından dolayı bağlantının sona çatmasına səbəb olur. Ancaq inadkarlıq və "clumsy" adlı mükəmməl bir alət sayəsində clumsy nəyin baş verdiyini aşkar edə bildim.

Qısaca desəm: bir səhv və gecikmə vəziyyətinin simulyasiyasının tam həyata keçirilməməsi səbəbindən müştəri bəzən bir takt zamanı təxminən 400 oyun varlığına olan oyunçu tərəfindən daxil edilmiş hərəkətlərin seçimi ilə ibarət olan bir şəbəkə paketini göndərməli olur (biz buna "megapaketi" deyirik). Sonra server yalnız bütün bu daxil etmə hərəkətlərini düzgün almalı deyil, həm də bunları digər müştərilərə göndərməlidir. Əgər 200 müştəri varsa, bu tez bir zamanda problemə çevrilir. Serverə olan kanal tez dolur ki, bu da paketlərin itirilməsinə və təkrarlanan paketlərin kaskadına səbəb olur. Daxil etmə hərəkətlərinin gecikməsi daha çox müştərinin megapaketlər göndərməsinə səbəb olur və onların sürəti daha da artır. Şanslı müştərilər bərpa oluna bilirlər, qalanlar isə "bağlanır".

Mega paket: Factorio-nun inkişaf etdiriciləri 200 oyunçulu çox oyunlu problemindən necə xilas oldular
Problem quite fundamental idi, və mən onu aradan qaldırmağa iki həftə sərf etdim. Bu, olduqca texniki bir məsələdir, ona görə də aşağıda ətraflı texniki detal təqdim edəcəyəm. Amma əvvəlcə bilmək lazımdır ki, 4 iyun tarixində buraxılmış 0.17.54 versiyasından etibarən əlaqə problemləri zamanı çoxsaylı oyun daha sabit oldu, lags gizlədilməsi isə daha az problemli oldu (daha az ləngimə və teleportasiya). Bundan əlavə, mən döyüşdə lags gizlədilməsinin üsulunu dəyişdirdim və ümid edirəm ki, bununla onların bir az daha hamar olmasını təmin edəcəyəm.

Çox istifadəçi üçün mega paket — texniki detalları

Sadə izah etsək, oyundakı çoxsaylı rejimi bu şəkildə işləyir: bütün müştərilər oyunun vəziyyətini simulyasiya edərək yalnız oyunçunun girişini alır və göndərir (bu, "giriş hərəkətləri" adlanır, Input Actions). Serverin əsas vəzifəsi, bütün müştərilərin eyni hərəkətləri bir dövrədə yerinə yetirdiyini ötürmək və nəzarət etməkdir. Bu barədə daha ətraflı məlumatı Input Actions FFF-149 baxaraq oxuya bilərsiniz. Server hansı hərəkətlərin icra olunacağını müəyyən etməlidir, oyunçunun hərəkətləri təxminən belə bir yol keçir: oyunçu hərəkəti -> oyun müştərisi -> şəbəkə -> server -> şəbəkə -> oyun müştərisi. Bu, oyunçunun hər bir hərəkətinin yalnız şəbəkə üzərindən oraya-buraya keçdikdən sonra icra olunmasını göstərir. Buna görə də, oyun olduqca ləngiməli görünəcəkdi, buna görə də çoxsaylı rejim açıldıqdan sonra lags gizlətmə mexanizmi dərhal təqdim edildi. Lags gizlətmə oyunçunun girişini digər oyunçuların hərəkətlərini nəzərə almadan və serverin qərarlarını qəbul etmədən simulyasiya edir..

Factorio oyunu daxilində oyun vəziyyəti

Mega paket: Factorio-nun inkişaf etdiriciləri 200 oyunçulu çox oyunlu problemindən necə xilas oldular
Game State — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır. Bundan əlavə

bizdə lags vəziyyəti — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır. Latency State var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır.Bu isə müqəddəs deyil və yalnız oyunçunun daxil etdiyi məlumatlara əsaslanaraq gələcəkdə oyunun vəziyyətinin necə olacağını əks etdirir. var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır. Bu məqsədlə, biz yaradılanların nüsxəsini saxlayırıq Input Actions.

lags növbəsində. Input Actions в очереди задержек.

Mega paket: Factorio-nun inkişaf etdiriciləri 200 oyunçulu çox oyunlu problemindən necə xilas oldular
Yəni prosesi mütəxəssis tərəfində başa çatdıra bilərsiniz, görüntü belə görünəcək:

  1. Tətbiq edirik Input Actions bütün oyunçulara — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır. bu giriş hərəkətləri serverdən necə alındığına uyğun olaraq.
  2. Gecikmələr sırasından bütün Input Actions, serverin məlumatlarına əsasən artıq tətbiq olunmuş olanları silirik — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır..
  3. Silirik var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır. və onu sıfırlayırıq ki, bu da tam olaraq — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır..
  4. Gecikmələr sırasındakı bütün hərəkətləri tətbiq edirik var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır..
  5. Məlumatlara əsaslanaraq — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır.var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır. oyunu oyunçunun qarşısına gətiririk.

Bütün bunlar hər bir takt zamanı təkrarlanır.

Çox mürəkkəbdir? Narahat olmayın, hələ hər şey deyil. İnternet bağlantılarının etibarsızlığını kompensasiya etmək üçün iki mexanizm yaratdıq:

  • İkincisi: server, oyunun taktı zamanı Input Actions icra ediləcək olanları təyin edərkən, əgər bir oyunçunun (məsələn, artan gecikmə səbəbindən) gəlməsini almadığını düşünürsə Input Actions , o, gözləməyəcək və bu müştəriyə "sənin Input Actions, çalışacağam ki, gələn taktda əlavə edim" deyəcək. Bu, bir oyunçunun bağlantısı (və ya kompüteri) ilə bağlı problemlər nəticəsində bütün digər oyunçuların oyun kartının yenilənməməsini təmin etmək məqsədilə edilir. Qeyd etmək lazımdır ki, Input Actions gözardı edilmir, sadəcə olaraq təxirə salınır.
  • Tam geri dönüş yolu gecikməsi: server, hər müştəri üçün müştəri ilə server arasındakı geri dönüş məlumat ötürmə gecikməsinin nə qədər olduğunu proqnozlaşdırmağa çalışır. Hər 5 saniyədə, lazımdırsa, müştəri ilə yeni gecikməni müzakirə edir (əvvəlki bağlantı davranışına əsasən) və buna uyğun olaraq geri dönüş məlumat ötürmə gecikməsini artırır və ya azaldır.

Bu mexanizmlər özləri sadə olsa da, birlikdə istifadə edildikdə (bu, gecikmə problemləri ilə rastlaşdıqda tez-tez olur), kodun mantığı idarəolunmaz olur və bir çox sərhəd halları ilə dolur. Həmçinin, bu mexanizmlər işə düşdükdə server və gecikmə sırası spesifik xüsusiyyətləri düzgün yerləşdirməlidir Input Action adlı StopMovementInTheNextTick. Bu sayədə, bağlantı problemləri zamanı xarakter təkbaşına (məsələn, qatarın altına) qaçmayacaq.

İndi sizə varlıqların seçilməsi necə işlədiyini izah etmək lazımdır. Göndərilən tiplerden biri Input Action — bu, bir varlığın seçilme halinin dəyişməsidir. O, bütün istifadəçilərə oyunçunun hansı varlığın üzərinə siçanı gətirdiyini bildirir. Anlamaq üçün, bu müştərilər tərəfindən göndərilən ən tez-tez daxil olan əməliyyatlardan biridir, buna görə də kanalın bant genişliyini qənaət etmək üçün, onun mümkün qədər az yer tutması üçün optimizasiya etdik. Bu, hər bir varlığın seçilməsi zamanı tam dəqiq xəritə koordinatlarını saxlamaq əvəzinə, əvvəlki seçimin nisbətən aşağı dəqiqlikli yerini saxlamağı təmin edərək həyata keçirilir. Bu, yaxşı işləyir, çünki siçanla seçmə adətən əvvəlki seçimin yaxınlığında baş verir. Buna görə iki mühüm tələbin olması ortaya çıxır: Input Actions heç vaxt atlana bilməz və düzgün sırayla yerinə yetirilməlidir. Bu tələblər təmin olunur: — xəritənin, oyunçunun, varlıqların və hər şeyin tam vəziyyətidir. O, serverdən alınan hərəkətlərə əsasən bütün müştərilərdə deterministik olaraq simulyasiya olunur. Oyun vəziyyəti müqəddəsdir və əgər bir vaxt bu vəziyyət serverdən və ya digər müştəridən fərqləməyə başlayarsa, desininkronizasiya yaranır.. Ancaq tapşırıq Gecikmə halı oyunçu üçün «kafi gözəl görünmək» məsələsidir, gecikmə halında bunlar təmin edilmir. var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır. nəzərə almır bir çox kənar hallar, dövrlərin atlması və geri-qayıtma gecikmələrinin dəyişməsi ilə bağlı.

Artıq siz hamısının nəyə yönəldiyini təxmin edə bilərsiniz. Nəhayət, mega paket probleminin səbəblərini görməyə başlayırıq. Problemin kökü, seçim dəyişikliklərindən ibarət bir əmri göndərmək qərarına gəlməkdə varlıq seçimlərinin məntiqinə bağlıdır var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır., bu hal həmişə düzgün məlumatı ehtiva etmir. Buna görə mega paket təxminən belə yaradılır:

  1. Oyunçunun bağlantı problemi var.
  2. Dövr atlma və geri-qayıtma gecikmələrini tənzimləmə mexanizmləri işə daxil olur.
  3. Gecikmə halının sırası bu mexanizmləri nəzərə almır. Bu, bəzi əmrlərin vaxtından əvvəl silinməsinə və ya yanlış sırada icra edilməsinə səbəb olur, bu da səhv nəticələrə yol açır. var. Bu, əsas vəziyyətin kiçik bir alt dəstəsini saxlayır..
  4. Oyunçunun bağlantı problemi düzəlir və o, serverə çatmaq üçün 400 dövrə qədər simulyasiya edir.
  5. Hər dövrdə yeni varlıqların seçim dəyişikliklərini göndərmək üçün yaradılır və serverə göndərilməyə hazırlanır.
  6. Müştəri serverə 400-dən çox varlıq seçim dəyişiklikləri (və digər əməliyyatlarla: atış, gediş və s. də bu problemə məruz qalıb) ilə mega paket göndərir.
  7. Server 400 giriş əməliyyatı alır. Ona bircə giriş əməliyyatını buraxmağa icazə verilmədiyi üçün, o, bütün müştərilərə bu əməliyyatları yerinə yetirməyi əmr edir və onları şəbəkə ilə göndərir.

İroniya ondadır ki, kanalın bant genişliyini qənaət etmək üçün nəzərdə tutulmuş mexanizm nəticədə böyük şəbəkə paketləri yaradırdı.

Biz bu problemi gözləyən növbələrin yenilənməsi və dəstəklənməsi ilə bağlı bütün kənar halları düzəltdik. Bu, bir az zaman alsa da, sonunda hər şeyi düzgün həyata keçirmək daha dəyərli oldu, sürətli hakerlərə etibar etməyi seçməkdən daha yaxşıdır.

Mənbə: habr.com

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster