Megapack: Factorio 200 оюнчу көп оюнчу маселесин кантип чечти

Megapack: Factorio 200 оюнчу көп оюнчу маселесин кантип чечти
Ушул жылдын май айында мен оюнчу катары катыштым MMO окуялар KatherineOfSky. Оюнчулардын саны белгилүү бир санга жеткенде, бир нече мүнөт сайын алардын айрымдары “жыгылып” турганын байкадым. Бактыга жараша (бирок мен үчүн эмес), мен ажыратылган оюнчулардын бири болгом ар дайым, жакшы байланыш менен да. Мен муну жеке чакырык катары кабыл алып, көйгөйдүн себептерин издей баштадым. Үч жумалык мүчүлүштүктөрдү оңдоо, сыноо жана оңдоолордон кийин ката акыры оңдолду, бирок бул сапар оңой болгон жок.

Көп оюнчу оюндарынын көйгөйлөрүнө көз салуу абдан кыйын. Алар, адатта, абдан белгилүү тармак параметрлери жана абдан өзгөчө оюн шарттарында пайда болот (бул учурда, 200дөн ашык оюнчулар бар). Көйгөй кайра чыгарыла турган болсо да, аны туура оңдоо мүмкүн эмес, анткени үзгүлтүккө учуратуу чекиттерин киргизүү оюнду токтотуп, таймерлерди чаташтырат жана адатта туташуунун тайм-ашына алып келет. Бирок тырышчаактык жана сонун курал деп аталган рахмат уялчаак Эмне болуп жатканын билүүгө жетиштим.

Кыскача айтканда, катадан жана күтүү абалын симуляциялоонун толук аткарылбаганынан улам, кардар кээде бир саат циклинде болжол менен 400 оюн объектисинин оюнчунун киргизүү тандоо аракеттеринен турган тармак пакетин жөнөтүүгө туура келген кырдаалга туш болот ( биз муну "мега-пакет" деп атайбыз). Андан кийин сервер бул киргизүү аракеттеринин баарын туура кабыл албастан, башка кардарларга да жөнөтүшү керек. Эгер сизде 200 кардар болсо, бул тез эле көйгөй болуп калат. Серверге шилтеме тез эле бүтүп калат, бул пакеттин жоголушуна жана кайра суралган пакеттердин каскадына алып келет. Киргизүү аракетин кечеңдетүү андан да көп кардарлардын мегапакеттерди жөнөтүшүнө алып келет, бул кар көчкүнүн дагы чоңоюшуна алып келет. Бактылуу кардарлар айыгып кетүүгө үлгүрүшөт, калгандарынын баары кулап калышат.

Megapack: Factorio 200 оюнчу көп оюнчу маселесин кантип чечти
Көйгөй абдан негизги болчу жана аны оңдоо үчүн мага 2 жума кетти. Бул абдан техникалык, ошондуктан мен төмөндө ширелүү техникалык маалыматтарды түшүндүрүп берем. Бирок, адегенде, 0.17.54-июнда чыккан 4 версиясынан бери, убактылуу туташуу көйгөйлөрүнө байланыштуу, көп оюнчу туруктуураак болуп калганын жана кечигүүлөрдү жашыруу бир топ катаал (аз жайлоо жана телепортация) болуп калганын билишиңиз керек. Мен ошондой эле согуштук артта калууларды жашыруу ыкмасын өзгөрттүм жана бул аны бир аз жылмакай кылат деп үмүттөнөм.

Көп оюнчу Mega Pack - Техникалык маалымат

Жөнөкөй сөз менен айтканда, оюндагы көп оюнчу төмөнкүдөй иштейт: бардык кардарлар оюндун абалын имитациялашат, бир гана оюнчу киргизүүнү кабыл алып жана жөнөтүшөт («киргизүү аракеттери» деп аталат», Киргизүү аракеттери). Сервердин негизги милдети өткөрүп берүү болуп саналат Киргизүү аракеттери жана бардык кардарлардын бир эле саат циклинде бирдей аракеттерди аткарышын көзөмөлдөө. Бул тууралуу кененирээк макаладан окуй аласыз FFF-149.

Сервер кандай аракеттерди жасоо керектиги жөнүндө чечим кабыл алышы керек болгондуктан, оюнчунун аракеттери болжол менен ушул жол боюнча жылат: оюнчу аракети -> оюн клиенти -> тармак -> сервер -> тармак -> оюн кардары. Бул ар бир оюнчунун аракети тармак боюнча айланып өткөндөн кийин гана аткарылат дегенди билдирет. Ушундан улам, оюн өтө жай болуп көрүнөт, ошондуктан оюнга көп оюнчу киргизилгенден кийин, кечигүүлөрдү жашыруу механизми киргизилген. Жашыруу кечигүү башка оюнчулардын аракеттерин жана сервердин чечимдерин эске албастан, оюнчу киргизүүнү симуляциялайт.

Megapack: Factorio 200 оюнчу көп оюнчу маселесин кантип чечти
Factorio оюн абалы бар Оюндун абалы картанын, оюнчунун, объекттердин жана башка нерселердин толук абалы. Ал серверден алынган иш-аракеттердин негизинде бардык кардарларда детерминисттик түрдө окшоштурулган. Оюндун абалы ыйык, эгер ал серверден же башка кардардан айырмаланып баштаса, анда синхрондоштуруу пайда болот.

тышкары Оюндун абалы бизде кечиктирилгис абал бар Latency State. Ал негизги абалдын кичинекей бөлүгүн камтыйт. Latency State ыйык эмес жана жөн гана оюнчунун киргизүүлөрүнүн негизинде оюндун абалы келечекте кандай болорун сүрөттөйт Киргизүү аракеттери.

Бул үчүн, биз түзүлгөн көчүрмөсүн сактайбыз Киргизүү аракеттери кечигүү кезегинде.

Megapack: Factorio 200 оюнчу көп оюнчу маселесин кантип чечти
Башкача айтканда, процесстин аягында кардар тарабында сүрөт төмөнкүдөй көрүнөт:

  1. Колдонуу Киргизүү аракеттери бардык оюнчулар үчүн Оюндун абалы бул киргизүү аракеттери серверден кандайча кабыл алынган.
  2. Баарын кечигүү кезегинден алып салабыз Киргизүү аракеттери, сервердин айтымында, буга чейин колдонулган Оюндун абалы.
  3. Жок кылуу Latency State жана аны баштапкы абалга келтирип коюңуз, ошондуктан ал дал ошондой көрүнөт Оюндун абалы.
  4. Биз кечиктирүү кезегинен баштап бардык аракеттерди колдонобуз Latency State.
  5. Маалыматтарга негизделген Оюндун абалы и Latency State Биз оюнду оюнчуга беребиз.

Мунун баары ар бир чарада кайталанат.

Өтө кыйынбы? Эс алба, бул баары эмес. Ишенимсиз интернет байланыштарынын ордун толтуруу үчүн биз эки механизмди түздүк:

  • Өткөрүлбөй калган кенелер: сервер муну чечкенде Киргизүү аракеттери оюндун ыргагы боюнча аткарылат, анда ал албаса Киргизүү аракеттери кээ бир оюнчу (мисалы, кечигүүдөн улам), ал күтпөйт, бирок бул кардарга кабарлайт: "Мен сиздин оюңузду эске алган жокмун. Киргизүү аракеттери, Мен аларды кийинки тилкеге ​​кошууга аракет кылам." Бул бир оюнчунун туташуусуна (же компьютерине) байланыштуу көйгөйлөрдөн улам, картаны жаңыртуу башкалар үчүн жайлабашы үчүн жасалат. деп белгилей кетуу керек Киргизүү аракеттери көз жаздымда калбай, жөн гана четке кагышат.
  • Толук айланып келүү күтүүсү: Сервер кардар менен сервердин ортосундагы баруу кечигүү ар бир кардар үчүн кандай болорун болжолдоого аракет кылат. Ар бир 5 секунд сайын, керек болсо, кардар менен жаңы кечигүү боюнча сүйлөшүүлөрдү жүргүзөт (байланыш мурун кандай болгонуна жараша) жана ошого жараша эки тараптын күтүү убактысын көбөйтөт же азайтат.

Өз алдынча, бул механизмдер абдан жөнөкөй, бирок алар чогуу колдонулганда (бул көбүнчө туташуу көйгөйлөрү менен болот), коддун логикасын башкаруу кыйын болуп калат жана көптөгөн кырдуу учурлар менен. Кошумчалай кетсек, бул механизмдер ишке киргенде, сервер жана кечигүү кезеги атайын нерсени туура ишке ашырышы керек Киргизүү аракети Атындагы StopMovementInTheNextTick. Мунун аркасында байланышта көйгөйлөр жаралса, каарман өз алдынча чуркабайт (мисалы, поезддин алдында).

Эми биз сизге объектти тандоо кандай иштээрин түшүндүрүшүбүз керек. Берилген түрлөрүнүн бири Киргизүү аракети объект тандоо абалынын өзгөрүшү болуп саналат. Бул оюнчу кайсы объекттин үстүндө турганын бардыгына айтып берет. Сиз элестете тургандай, бул кардарлар тарабынан жөнөтүлгөн эң кеңири таралган киргизүү аракеттеринин бири, андыктан өткөрүү жөндөмдүүлүгүн үнөмдөө үчүн, биз аны мүмкүн болушунча аз орунду ээлеши үчүн оптималдаштырдык. Анын иштөө ыкмасы ар бир объект тандалып алынганда, абсолюттук, жогорку тактыктагы карта координаттарын сактоонун ордуна, оюн мурунку тандоодон төмөн тактыктагы салыштырмалуу офсетти сактайт. Бул жакшы иштейт, анткени чычкандын тандоосу мурунку тандоого абдан жакын болот. Бул эки маанилүү талаптарды жаратат: Киргизүү аракеттери Аларды эч качан өткөрүп жибербөө керек жана туура тартипте толтурулушу керек. Бул талаптар аткарылат Оюндун абалы. Бирок тапшырмадан бери Кечүү абалы оюнчу үчүн "жетиштүү жакшы көрүнүүдө", алар кечигүү абалына ыраазы эмес. Latency State эске албайт көп кырдуу учурлар, саат циклдерин өткөрүп жиберүү жана айланма берүү кечигүүлөрүн өзгөртүү менен байланышкан.

Бул кайда баратканын сиз азыртадан эле биле аласыз. Акыры, биз мегапакет көйгөйүнүн себептерин көрө баштадык. Көйгөйдүн тамыры объектти тандоо логикасына таянат Latency State, жана бул абал дайыма туура маалыматты камтый бербейт. Ошентип, бир мегапакет төмөнкүдөй пайда болот:

  1. Оюнчуда байланыш көйгөйлөрү бар.
  2. Сааттын циклдерин өткөрүп жиберүү жана эки тарапка берүүнүн кечиктирилишин жөнгө салуу механизмдери ишке кирет.
  3. Кечиктирүү мамлекеттик кезек бул механизмдерди эске албайт. Бул кээ бир аракеттердин мөөнөтүнөн мурда алынып салынышына же туура эмес тартипте аткарылышына алып келет, натыйжада туура эмес Latency State.
  4. Оюнчуда туташуу көйгөйү бар жана серверди кууп чыгуу үчүн 400 циклге чейин окшоштурат.
  5. Ар бир белги коюлганда объекттин тандоосун өзгөртүүчү жаңы аракет түзүлөт жана серверге жөнөтүүгө даярдалат.
  6. Кардар серверге 400+ объект тандоо өзгөртүүлөрүнүн мега-партиясын жөнөтөт (жана башка аракеттер менен: атуу абалы, жөө басуу абалы, ж.б. да бул көйгөйдөн жапа чеккен).
  7. Сервер 400 киргизүү аракеттерин алат. Эч кандай киргизүү аракеттерин өткөрүп жиберүүгө уруксат берилбегендиктен, ал бардык кардарларга ошол аракеттерди жасоого буйрук берет жана аларды тармак аркылуу жөнөтөт.

Тагдырдын тамашасы, өткөрүү жөндөмдүүлүгүн үнөмдөө үчүн иштелип чыккан механизм эбегейсиз чоң тармак пакеттерин түзүп бүттү.

Биз жаңыртуу жана артта калган кезекти колдоонун бардык четки учурларын оңдоо менен бул маселени чечтик. Бул бир аз убакытты талап кылса да, акырында тез хакерлерге таянгандын ордуна, аны туура кабыл алганга арзыйт.

Source: www.habr.com

Комментарий кошуу