Megapack: Factorio хөгжүүлэгчид 200 тоглогчийн олон тоглогчтой асуудлыг хэрхэн шийдэж чадсан бэ?

Megapack: Factorio хөгжүүлэгчид 200 тоглогчийн олон тоглогчтой асуудлыг хэрхэн шийдэж чадсан бэ?
Энэ оны тавдугаар сард би тоглогчоор оролцсон MMO арга хэмжээ KatherineOfSky. Тоглогчдын тоо тодорхой тоонд хүрэхэд хэдэн минут тутамд зарим нь "унадаг" гэдгийг би анзаарсан. Таны хувьд (гэхдээ миний хувьд биш) азаар би холбоо тасарсан тоглогчдын нэг байсан болгонд, сайн холболттой байсан ч гэсэн. Би үүнийг хувийн сорилт гэж хүлээн авч, асуудлын шалтгааныг хайж эхэлсэн. Гурван долоо хоногийн турш дибаг хийж, туршиж, зассаны эцэст алдааг зассан ч энэ аялал тийм ч амар байсангүй.

Олон тоглогчтой тоглоомуудтай холбоотой асуудлуудыг илрүүлэхэд маш хэцүү байдаг. Тэд ихэвчлэн сүлжээний тодорхой параметрүүд болон тоглоомын маш тодорхой нөхцөлд (энэ тохиолдолд 200 гаруй тоглогчтой) тохиолддог. Асуудлыг дахин гаргах боломжтой байсан ч зөв дибаг хийх боломжгүй, учир нь таслах цэг оруулах нь тоглоомыг зогсоож, таймерыг төөрөгдүүлж, холболтын хугацаа алддаг. Гэвч шаргуу, гайхалтай хэрэгсэл гэж нэрлэдэг баярлалаа болхи Би юу болоод байгааг олж мэдсэн.

Товчхондоо, алдаа болон хоцрогдлын төлөвийн симуляцийг бүрэн хэрэгжүүлээгүйн улмаас үйлчлүүлэгч заримдаа нэг цагийн мөчлөгт ойролцоогоор 400 тоглоомын нэгжийн тоглогчийн оролтын сонголтоос бүрдсэн сүлжээний багцыг илгээх шаардлагатай болдог. Бид үүнийг "мега пакет" гэж нэрлэдэг). Дараа нь сервер эдгээр бүх оролтын үйлдлийг зөв хүлээн аваад зогсохгүй бусад бүх үйлчлүүлэгчид рүү илгээх ёстой. Хэрэв та 200 үйлчлүүлэгчтэй бол энэ нь хурдан асуудал болно. Сервертэй холбогдох холбоос хурдан бөглөрч, пакет алдагдахад хүргэж, дахин хүсэлт гаргасан пакетуудын цуваа үүснэ. Оролтын үйлдлийг хойшлуулснаар улам олон үйлчлүүлэгчид мегапакет илгээж, нуранги улам бүр томрох болно. Азтай үйлчлүүлэгчид эдгэрч, бусад нь унадаг.

Megapack: Factorio хөгжүүлэгчид 200 тоглогчийн олон тоглогчтой асуудлыг хэрхэн шийдэж чадсан бэ?
Асуудал нэлээд суурь байсан бөгөөд үүнийг засахад 2 долоо хоног зарцуулсан. Энэ бол нэлээд техникийн шинж чанартай тул би доорх шүүслэг техникийн дэлгэрэнгүй мэдээллийг тайлбарлах болно. Гэхдээ эхлээд та 0.17.54-р сарын 4-нд гарсан XNUMX хувилбараас хойш холболтын түр зуурын асуудалтай тулгарсан тул олон тоглогч илүү тогтвортой болж, саатал нуух нь илүү бага алдаатай (удаашрах, телепорт хийх) болсныг мэдэх хэрэгтэй. Би мөн байлдааны хоцролтыг нуух арга замыг өөрчилсөн бөгөөд энэ нь үүнийг бага зэрэг зөөлөн болгоно гэж найдаж байна.

Multiplayer Mega Pack - Техникийн дэлгэрэнгүй мэдээлэл

Энгийнээр хэлбэл, тоглоомын олон тоглогч дараах байдлаар ажилладаг: бүх үйлчлүүлэгчид тоглоомын төлөвийг дуурайж, зөвхөн тоглогчийн оролтыг хүлээн авч, илгээдэг ("оролтын үйлдэл" гэж нэрлэдэг), Оролтын үйлдлүүд). Серверийн гол үүрэг бол дамжуулах явдал юм Оролтын үйлдлүүд мөн бүх үйлчлүүлэгчид ижил цагийн мөчлөгт ижил үйлдлийг гүйцэтгэхийг хянах. Та энэ талаар дэлгэрэнгүйг нийтлэлээс уншиж болно FFF-149.

Сервер ямар үйлдэл хийх талаар шийдвэр гаргах ёстой тул тоглогчийн үйлдэл ойролцоогоор дараах зам дагуу явагдана: тоглогчийн үйлдэл -> тоглоомын клиент -> сүлжээ -> сервер -> сүлжээ -> тоглоомын клиент. Энэ нь тоглогч бүрийн үйлдэл зөвхөн сүлжээгээр тойрон аялсны дараа хийгддэг гэсэн үг юм. Үүнээс болж тоглоом маш удаан мэт санагдаж байсан тул тоглоомонд олон тоглогчийг нэвтрүүлсний дараа саатал нуух механизмыг нэвтрүүлсэн. Саатал нуух нь бусад тоглогчдын үйлдэл болон серверийн шийдвэрийг харгалзахгүйгээр тоглогчийн оролтыг дуурайдаг.

Megapack: Factorio хөгжүүлэгчид 200 тоглогчийн олон тоглогчтой асуудлыг хэрхэн шийдэж чадсан бэ?
Factorio тоглоомын төлөвтэй байна Тоглоомын байдал Энэ нь карт, тоглогч, аж ахуйн нэгж болон бусад бүх зүйлийн бүрэн төлөв юм. Энэ нь серверээс хүлээн авсан үйлдлүүд дээр үндэслэн бүх үйлчлүүлэгчдэд тодорхой загварчлагдсан байдаг. Тоглоомын төлөв нь ариун бөгөөд хэрэв энэ нь сервер эсвэл бусад үйлчлүүлэгчээс ялгаатай болж эхэлбэл синхрончлол хийгдэнэ.

бусад Тоглоомын байдал Бид сааталтай байна Хоцролтын төлөв. Энэ нь үндсэн төлөвийн жижиг дэд багцыг агуулдаг. Хоцролтын төлөв ариун биш бөгөөд зүгээр л тоглогчийн оролт дээр үндэслэн тоглоомын төлөв ирээдүйд ямар харагдахыг харуулсан дүр зургийг илэрхийлдэг Оролтын үйлдлүүд.

Энэ зорилгоор бид үүсгэсэн хуулбарыг хадгалдаг Оролтын үйлдлүүд саатлын дараалалд байна.

Megapack: Factorio хөгжүүлэгчид 200 тоглогчийн олон тоглогчтой асуудлыг хэрхэн шийдэж чадсан бэ?
Өөрөөр хэлбэл, үйл явцын төгсгөлд үйлчлүүлэгчийн тал дээрх зураг дараах байдалтай байна.

  1. Өргөдөл гаргах Оролтын үйлдлүүд бүх тоглогчид Тоглоомын байдал эдгээр оролтын үйлдлийг серверээс хүлээн авсан арга.
  2. Бид саатлын дарааллаас бүх зүйлийг устгадаг Оролтын үйлдлүүд, серверийн мэдээлснээр аль хэдийн хэрэглэгдсэн байна Тоглоомын байдал.
  3. Устгах Хоцролтын төлөв гэсэнтэй яг адилхан харагдахаар дахин тохируулаарай Тоглоомын байдал.
  4. Бид саатлын дарааллаас эхлээд бүх үйлдлийг хэрэгжүүлдэг Хоцролтын төлөв.
  5. Өгөгдөл дээр үндэслэсэн Тоглоомын байдал и Хоцролтын төлөв Бид тоглоомыг тоглогчдод өгдөг.

Энэ бүхэн хэмжүүр болгонд давтагддаг.

Хэт хэцүү юу? Битгий тайвшир, энэ бүгд биш. Найдваргүй интернет холболтыг нөхөхийн тулд бид хоёр механизмыг бий болгосон.

  • Алдагдсан тэмдэг: сервер үүнийг шийдэх үед Оролтын үйлдлүүд тоглоомын цохилтоор цаазлагдах болно, дараа нь тэр хүлээн аваагүй бол Оролтын үйлдлүүд Зарим тоглогч (жишээ нь, саатал ихэссэний улмаас) тэр хүлээхгүй, харин энэ үйлчлүүлэгчид "Би таны мэдээллийг анхаарч үзээгүй" гэж мэдэгдэнэ. Оролтын үйлдлүүд, Би тэдгээрийг дараагийн мөрөнд нэмэхийг хичээх болно." Энэ нь нэг тоглогчийн холболттой (эсвэл компьютер) холбоотой асуудлаас болж газрын зургийн шинэчлэлтийг бусад хүмүүст удаашруулахгүйн тулд хийгддэг. Үүнийг тэмдэглэх нь зүйтэй Оролтын үйлдлүүд үл тоомсорлодоггүй, зүгээр л хойш тавь.
  • Хоёр талын бүтэн аяллын хоцрогдол: Сервер нь үйлчлүүлэгч болон серверийн хоорондох хоёр талын хоцролт нь үйлчлүүлэгч бүрийн хувьд ямар байхыг таахыг оролддог. Энэ нь 5 секунд тутамд шаардлагатай бол үйлчлүүлэгчтэй шинэ хоцролтыг хэлэлцдэг (өнгөрсөн хугацаанд холболт хэрхэн явагдсанаас хамаарч) ба хоёр талын аялалын хоцролтыг зохих хэмжээгээр нэмэгдүүлж, багасгадаг.

Эдгээр механизмууд нь дангаараа маш энгийн боловч тэдгээрийг хамтад нь ашиглах үед (энэ нь ихэвчлэн холболтын асуудалтай байдаг) кодын логикийг удирдахад хэцүү бөгөөд олон тооны захын тохиолдол гардаг. Нэмж дурдахад, эдгээр механизмууд ажиллахад сервер болон саатлын дараалал нь тусгай тохиргоог зохих ёсоор хэрэгжүүлэх ёстой Оролтын үйлдэл нэрээр нь TheNextTick доторх хөдөлгөөнийг зогсоо. Үүний ачаар хэрэв холболттой холбоотой асуудал гарвал дүр нь өөрөө гүйхгүй (жишээлбэл, галт тэрэгний өмнө).

Одоо бид танд аж ахуйн нэгжийн сонголт хэрхэн явагддагийг тайлбарлах хэрэгтэй байна. Дамжуулсан төрлүүдийн нэг Оролтын үйлдэл аж ахуйн нэгжийн сонголтын төлөвийн өөрчлөлт юм. Энэ нь тоглогч аль объект дээр гүйж байгааг хүн бүрт хэлж өгдөг. Таны төсөөлж байгаачлан энэ нь үйлчлүүлэгчдийн илгээдэг хамгийн түгээмэл оролтын нэг бөгөөд зурвасын өргөнийг хэмнэхийн тулд бид үүнийг аль болох бага зай эзлэхээр оновчтой болгосон. Ажиллах арга нь объект бүрийг сонгохдоо үнэмлэхүй, өндөр нарийвчлалтай газрын зургийн координатыг хадгалахын оронд өмнөх сонголтоос харьцангуй бага нарийвчлалтай харьцангуй зөрүүг хадгалдаг. Хулганы сонголт өмнөх сонголттой маш ойрхон байдаг тул энэ нь сайн ажилладаг. Энэ нь хоёр чухал шаардлагыг бий болгодог: Оролтын үйлдлүүд Тэдгээрийг хэзээ ч алгасаж болохгүй бөгөөд зөв дарааллаар бөглөх ёстой. Эдгээр шаардлагыг хангасан Тоглоомын байдал. Гэхдээ даалгавараас хойш Хоцролтын төлөв тоглогчийн хувьд "хангалттай сайхан харагдаж байна" нь тэд саатал байдалд сэтгэл хангалуун бус байна. Хоцролтын төлөв тооцдоггүй олон захын тохиолдол, цагийн мөчлөгийг алгасах, хоёр талын дамжуулалтын саатлыг өөрчлөхтэй холбоотой.

Энэ хаашаа явж байгааг та аль хэдийн таамаглаж болно. Бид эцэст нь мегапакттай холбоотой асуудлын шалтгааныг олж харж эхэлж байна. Асуудлын үндэс нь аж ахуйн нэгжийг сонгох логик дээр тулгуурладаг Хоцролтын төлөв, мөн энэ төлөв нь үргэлж зөв мэдээллийг агуулдаггүй. Тиймээс мегапакет нь дараах байдлаар үүсдэг.

  1. Тоглогч холболтын асуудалтай байна.
  2. Цагийн эргэлтийг алгасах, хоёр талын дамжуулалтын саатлыг зохицуулах механизмууд гарч ирдэг.
  3. Саатлын төлөвийн дараалал нь эдгээр механизмыг харгалзан үздэггүй. Энэ нь зарим үйлдлийг хугацаанаас нь өмнө арилгах эсвэл буруу дарааллаар гүйцэтгэхэд хүргэдэг. Хоцролтын төлөв.
  4. Тоглогч холболтын асуудалтай байгаа бөгөөд серверийг гүйцэхийн тулд 400 хүртэлх циклийг дуурайлган хийдэг.
  5. Шалз болгонд объектын сонголтыг өөрчлөх шинэ үйлдэл бий болж, сервер рүү илгээхэд бэлтгэгдэнэ.
  6. Үйлчлүүлэгч нь сервер рүү 400 гаруй аж ахуйн нэгжийн сонголтын өөрчлөлтийг илгээдэг (мөн бусад үйлдлээр: буудлагын төлөв, алхаж буй байдал гэх мэт энэ асуудалд өртсөн).
  7. Сервер нь 400 оролтын үйлдлийг хүлээн авдаг. Аливаа оролтын үйлдлийг алгасах эрхгүй тул бүх үйлчлүүлэгчид эдгээр үйлдлийг гүйцэтгэхийг тушааж, сүлжээгээр дамжуулдаг.

Хамгийн хачирхалтай нь зурвасын өргөнийг хэмнэх зорилготой механизм нь сүлжээний асар том пакетуудыг үүсгэж дууссан явдал юм.

Бид шинэчлэлт болон хоцрогдсон дарааллын дэмжлэгийн бүх захын тохиолдлыг засч, энэ асуудлыг шийдсэн. Хэдийгээр энэ нь нэлээд хугацаа шаардсан ч эцэст нь хурдан хакердахаас илүүтэйгээр үүнийг зөв хийх нь зүйтэй болов.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх