Чӣ тавр мо механикаи ҳисобкунии баллистикиро барои тирандози мобилӣ бо алгоритми ҷуброни таъхири шабакавӣ сохтем

Чӣ тавр мо механикаи ҳисобкунии баллистикиро барои тирандози мобилӣ бо алгоритми ҷуброни таъхири шабакавӣ сохтем

Салом, ман Никита Брижак, таҳиягари сервер аз Pixonic ҳастам. Имрӯз ман мехоҳам дар бораи ҷуброни ақибмонӣ дар мултипликатори мобилӣ сӯҳбат кунам.

Дар бораи ҷуброни таъхири сервер мақолаҳои зиёде навишта шудаанд, аз ҷумла ба забони русӣ. Ин тааҷҷубовар нест, зеро ин технология аз охири солҳои 90-ум дар эҷоди FPS мултипликатори фаъолона истифода мешавад. Масалан, шумо метавонед модули QuakeWorld-ро дар хотир доред, ки яке аз аввалинҳо буд.

Мо инчунин онро дар тирандозии мултипликатори Dino Squad истифода мебарем.

Дар ин мақола, ҳадафи ман на такрор кардани он чизе, ки аллакай ҳазорон маротиба навишта шудааст, балки гуфтан аст, ки чӣ гуна мо ҷуброни ақибмондаро дар бозии худ бо дарназардошти стеки технологияи худ ва хусусиятҳои асосии бозии худ татбиқ кардем.

Якчанд сухан дар бораи кортекс ва технологияи мо.

Dino Squad як тирандози мобилии PvP мебошад. Бозингарон динозаврҳои бо силоҳҳои гуногун муҷаҳҳазшударо назорат мекунанд ва дар дастаҳои 6v6 бо ҳамдигар меҷанганд.

Ҳам муштарӣ ва ҳам сервер ба Unity асос ёфтаанд. Меъморӣ барои тирандозҳо хеле классикӣ аст: сервер авторитарист ва пешгӯии муштарӣ ба мизоҷон кор мекунад. Моделсозии бозӣ бо истифода аз ECS-и дохилӣ навишта шудааст ва ҳам дар сервер ва ҳам дар муштарӣ истифода мешавад.

Агар шумо бори аввал аст, ки шумо дар бораи ҷуброни таъхир шунидаед, дар ин ҷо як экскурсияи мухтасар ба ин масъала аст.

Дар бозиҳои мултипликатори FPS, бозӣ одатан дар сервери дурдаст тақлид карда мешавад. Бозингарон вуруди худро (маълумот дар бораи калидҳои пахшшуда) ба сервер мефиристанд ва дар посух сервер ба онҳо ҳолати навшудаи бозиро бо назардошти маълумоти гирифташуда мефиристад. Бо ин схемаи мутақобила, таъхир байни пахш кардани тугмаи пеш ва лаҳзаи ҳаракати аломати плеер дар экран ҳамеша аз пинг зиёдтар хоҳад буд.

Дар ҳоле, ки дар шабакаҳои маҳаллӣ ин таъхир (маълумотро ақибмонии воридотӣ меноманд) ноаён бошад, ҳангоми бозӣ тавассути интернет эҳсоси “лағжиш дар болои ях”-ро ҳангоми идоракунии аломат эҷод мекунад. Ин мушкилот барои шабакаҳои мобилӣ дучанд муҳим аст, ки дар он ҳолате, ки пинги плеер 200 мс аст, ҳоло ҳам пайвасти аъло ҳисобида мешавад. Аксар вақт пинг метавонад 350, 500 ё 1000 мс бошад. Он гоҳ он қариб ғайриимкон мегардад, ки ба бозӣ shooter зуд бо аќиб вуруд.

Ҳалли ин мушкилот пешгӯии симулятсияи муштарӣ мебошад. Дар ин ҷо худи муштарӣ воридотро ба аломати плеер бидуни мунтазири посух аз сервер татбиқ мекунад. Ва вақте ки ҷавоб гирифта мешавад, он танҳо натиҷаҳоро муқоиса мекунад ва мавқеи рақибонро нав мекунад. Таъхир байни пахш кардани тугма ва намоиши натиҷа дар экран дар ин ҳолат хеле кам аст.

Дар ин ҷо фаҳмидани нозукиҳо муҳим аст: муштарӣ ҳамеша худро мувофиқи вуруди охирини худ ҷалб мекунад ва душманон - бо таъхири шабака, мувофиқи ҳолати қаблӣ аз маълумоти сервер. Яъне ҳангоми тирандозӣ ба душман, бозигар ӯро дар гузашта нисбат ба худаш мебинад. Бештар дар бораи пешгӯии муштарӣ мо пештар навишта будем.

Ҳамин тариқ, пешгӯии муштарӣ як масъаларо ҳал мекунад, аммо дигареро ба вуҷуд меорад: агар бозигар дар ҳамон нуқтае, ки душман дар гузашта буд, дар сервер ҳангоми тирандозӣ дар ҳамон нуқта тир парронад, душман дигар дар он ҷой набошад. Ҷуброни таъхири сервер кӯшиш мекунад, ки ин мушкилотро ҳал кунад. Вақте ки силоҳ тирандозӣ мешавад, сервер ҳолати бозиеро, ки плеер ҳангоми тирандозӣ дар маҳал дидааст, барқарор мекунад ва месанҷад, ки оё ӯ воқеан метавонад ба душман зарба занад. Агар ҷавоб "ҳа" бошад, зарба ҳисоб карда мешавад, ҳатто агар душман дар он лаҳза дигар дар сервер набошад.

Бо ин дониш мусаллаҳ шуда, мо ба татбиқи ҷуброни ақибмонии сервер дар Dino Squad шурӯъ кардем. Пеш аз ҳама, мо бояд фаҳмем, ки чӣ тавр дар сервер он чизеро, ки муштарӣ дидааст, барқарор кунем? Ва маҳз чӣ бояд барқарор карда шавад? Дар бозии мо, зарбаҳо аз силоҳ ва қобилиятҳо тавассути рейкастҳо ва қабатҳо, яъне тавассути ҳамкорӣ бо коллайдерҳои ҷисмонии душман ҳисоб карда мешаванд. Бинобар ин, ба мо лозим омад, ки мавқеъи ин коллайдерҳоро, ки плеер ба таври маҳаллӣ "дидааст" дар сервер дубора тавлид кунем. Он вақт мо версияи Unity 2018.x -ро истифода мебурдем. API физикаи он ҷо статикӣ аст, ҷаҳони физикӣ дар як нусха мавҷуд аст. Ҳеҷ гуна роҳе барои нигоҳ доштани ҳолати он ва сипас аз қуттӣ барқарор кардан нест. Пас, чӣ бояд кард?

Ҳалли он дар рӯи замин буд; ҳамаи унсурҳои онро мо аллакай барои ҳалли мушкилоти дигар истифода бурда будем:

  1. Барои ҳар як муштарӣ, мо бояд бидонем, ки ӯ ҳангоми пахш кардани тугмаҳо рақибонро дар кадом вақт дидааст. Мо аллакай ин маълумотро ба бастаи воридотӣ навиштаем ва онро барои танзими пешгӯии муштарӣ истифода кардем.
  2. Мо бояд таърихи давлатҳои бозиро нигоҳ дошта тавонем. Маҳз дар он мо мавқеъҳои рақибони худро (ва аз ин рӯ, коллайдерҳои онҳоро) нигоҳ медорем. Мо аллакай дар сервер таърихи давлатӣ доштем, мо онро барои сохтани он истифода бурдем дельтахо. Ваќти муносибро дониста, мо метавонистем давлати дурустро дар таърих пайдо кунем.
  3. Ҳоло, ки мо ҳолати бозӣ аз таърихи дар даст дорем, мо бояд тавонем маълумоти бозигарро бо ҳолати ҷаҳони ҷисмонӣ ҳамоҳанг созем. Коллайдерҳои мавҷуда - ҳаракат мекунанд, гумшудаҳо - эҷод мекунанд, нолозим - нобуд мекунанд. Ин мантиқ низ аллакай навишта шуда буд ва аз якчанд системаҳои ECS иборат буд. Мо онро барои нигоҳ доштани якчанд утоқҳои бозӣ дар як раванди Unity истифода мебарем. Ва азбаски ҷаҳони ҷисмонӣ як раванд аст, он бояд дар байни ҳуҷраҳо дубора истифода мешуд. Пеш аз ҳар як аломати симулятсия, мо ҳолати ҷаҳони физикиро "аз нав танзим мекунем" ва онро бо маълумот барои утоқи ҷорӣ дубора ба кор медарорем ва кӯшиш мекунем, ки объектҳои бозии Unity-ро тавассути як системаи доно ҷамъоварӣ то ҳадди имкон дубора истифода барем. Ҳама чизе, ки боқӣ монда буд, даъват кардани ҳамон мантиқ барои ҳолати бозӣ аз гузашта буд.

Бо якҷоя кардани ҳамаи ин унсурҳо, мо як "мошини вақт" гирифтем, ки метавонад ҳолати ҷаҳони физикиро ба лаҳзаи мувофиқ баргардонад. Рамз оддӣ шуд:

public class TimeMachine : ITimeMachine
{
     //История игровых состояний
     private readonly IGameStateHistory _history;

     //Текущее игровое состояние на сервере
     private readonly ExecutableSystem[] _systems;

     //Набор систем, расставляющих коллайдеры в физическом мире 
     //по данным из игрового состояния
     private readonly GameState _presentState;

     public TimeMachine(IGameStateHistory history, GameState presentState, ExecutableSystem[] timeInitSystems)
     {
         _history = history; 
         _presentState = presentState;
         _systems = timeInitSystems;  
     }

     public GameState TravelToTime(int tick)
     {
         var pastState = tick == _presentState.Time ? _presentState : _history.Get(tick);
         foreach (var system in _systems)
         {
             system.Execute(pastState);
         }
         return pastState;
     }
}

Танҳо фаҳмидани он ки ин мошин чӣ гуна истифода мешавад, то тирҳо ва қобилиятҳоро ба осонӣ ҷуброн кунад.

Дар соддатарин ҳолат, вақте ки механика ба як зарбаи ягона асос ёфтааст, ҳама чиз равшан ба назар мерасад: пеш аз тирандозӣ, ба ӯ лозим аст, ки ҷаҳони ҷисмониро ба ҳолати дилхоҳ баргардонад, рейкаст кунад, зарба ё гумро ҳисоб кунад ва ҷаҳонро ба ҳолати аввала баргардонед.

Аммо дар отряди Дино ин гуна механизаторон хеле каманд! Аксари аслиҳаҳои бозӣ снарядҳоро эҷод мекунанд - тирҳои дарозмӯҳлате, ки барои якчанд аломатҳои симулятсия парвоз мекунанд (дар баъзе ҳолатҳо, даҳҳо титҳо). Бо онҳо чӣ бояд кард, онҳо бояд соати чанд парвоз кунанд?

В мақолаи қадим дар бораи стек шабакаи Half-Life, бачаҳо аз Valve ҳамин саволро доданд ва ҷавоби онҳо ин буд: ҷуброни ақибмонии снаряд мушкил аст ва беҳтараш аз он канорагирӣ кунед.

Мо ин имконро надоштем: аслиҳаи снарядӣ хусусияти асосии тарроҳии бозӣ буд. Аз ин рӯ, мо маҷбур шудем, ки чизе бифаҳмем. Пас аз як ҳамлаи ақл, мо ду вариантро таҳия кардем, ки ба назар чунин менамуданд:

1. Мо снарядро ба вақти бозигаре, ки онро офаридааст, мепайвандем. Ҳар як аломати симулятсияи сервер, барои ҳар як тири ҳар як бозигар, мо ҷаҳони физикиро ба ҳолати муштарӣ бармегардонем ва ҳисобҳои заруриро иҷро мекунем. Ин равиш имкон дод, ки сарбории тақсимшуда ба сервер ва вақти пешбинишавандаи парвози снарядҳо дошта бошад. Пешгӯӣ барои мо махсусан муҳим буд, зеро мо ҳама снарядҳо, аз ҷумла снарядҳои душманро дар муштарӣ пешгӯӣ кардаем.

Чӣ тавр мо механикаи ҳисобкунии баллистикиро барои тирандози мобилӣ бо алгоритми ҷуброни таъхири шабакавӣ сохтем
Дар сурат бозингари тикаи 30 бо интизорй мушак парронда истодааст: вай мебинад, ки душман ба кадом самт давида истодааст ва суръати тахминии ракетаро медонад. Дар махалхо вай мебинад, ки вай ба нишони 33-юм зарба зад. Бо шарофати ҷуброни ақибмонӣ, он инчунин дар сервер пайдо мешавад

2. Мо ҳама чизро ҳамон тавре ки дар варианти аввал иҷро мекунем, аммо бо ҳисоб кардани як аломати симулятсияи тир, мо қатъ намекунем, балки тақлид кардани парвози онро дар дохили як аломати сервер идома медиҳем ва ҳар дафъа вақти онро ба сервер наздик мекунем. як ба як ишора ва нав кардани мавқеъҳои коллайдер. Мо ин корро то яке аз ду чиз рӯй надиҳад:

  • Мӯҳлати тир гузаштааст. Ин маънои онро дорад, ки ҳисобҳо ба охир расидаанд, мо метавонем як мисс ё зарбаро ҳисоб кунем. Ва ин дар ҳамон сатрест, ки дар он тир парронда шудааст! Барои мо ин ҳам як плюс ва ҳам манфӣ буд. Плюс - зеро барои бозигари тирандозӣ ин таъхир байни зарба ва коҳиши саломатии душманро ба таври назаррас коҳиш дод. Камбудиаш дар он аст, ки ҳамон таъсир ҳангоми тирпарронии рақибон ба плеер мушоҳида мешуд: душман, аз афташ, танҳо як мушаки сустро паррондааст ва зарар аллакай ҳисоб карда шудааст.
  • Тир ба вақти сервер расид. Дар ин ҳолат, симулятсияи он дар аломати сервери навбатӣ бидуни ҷуброни ақибмонӣ идома меёбад. Барои снарядҳои суст, ин метавонад аз ҷиҳати назариявӣ шумораи бозгашти физикиро дар муқоиса бо варианти аввал кам кунад. Ҳамзамон, сарбории нобаробар ба симулятсия афзоиш ёфт: сервер ё бекор буд, ё дар як аломати сервер даҳҳо аломати симулятсияро барои якчанд тир ҳисоб мекард.

Чӣ тавр мо механикаи ҳисобкунии баллистикиро барои тирандози мобилӣ бо алгоритми ҷуброни таъхири шабакавӣ сохтем
Ҳамон сенарияи дар расми қаблӣ, вале аз рӯи нақшаи дуюм ҳисоб. Мушаке бо вақти сервер дар ҳамон нишонае, ки тир ба вуқӯъ пайваст, «расид» ва зарбаро дар баробари аломати навбатӣ ҳисоб кардан мумкин аст. Дар аломати 31, дар ин ҳолат, ҷуброни ақибмонӣ дигар татбиқ карда намешавад

Ҳангоми татбиқи мо, ин ду равиш танҳо дар як чанд сатри код фарқ мекарданд, аз ин рӯ мо ҳардуро эҷод кардем ва муддати тӯлонӣ онҳо дар мувозӣ вуҷуд доштанд. Вобаста ба механикаи силоҳ ва суръати тир, мо барои ҳар як динозавр ин ё он вариантро интихоб кардем. Нуктаи гардиши ин чо дар бозии механикон пайдо шудани «агар дар фалон вакт ба душман чанд маротиба зарба занед, фалон мукофот гиред» буд. Ҳар як механик, ки дар он лаҳзае, ки плеер ба душман нақши муҳим дошт, аз кор кардан бо усули дуюм даст кашид. Ҳамин тавр, мо бо интихоби аввал гузаштем ва он ҳоло ба ҳама силоҳҳо ва ҳама қобилиятҳои фаъол дар бозӣ дахл дорад.

Алохида, масъалаи ичрои корро ба миён гузоштан меарзад. Агар шумо фикр мекардед, ки ҳамаи ин корҳоро суст мекунад, ман ҷавоб медиҳам: ин аст. Ягонагӣ дар ҳаракати коллайдерҳо ва фурӯзон ва хомӯш кардани онҳо хеле суст аст. Дар Dino Squad, дар ҳолати "бадтарин", метавонад якчанд сад снарядҳо дар як вақт дар ҷанг мавҷуд бошанд. Гузаронидани коллайдерҳо барои ҳисоб кардани ҳар як снаряд як ҳашамати бебаҳост. Аз ин рӯ, ба мо комилан зарур буд, ки шумораи "бозгаштҳои" физикаро ба ҳадди ақалл кам кунем. Барои ин, мо дар ECS як ҷузъи алоҳидае сохтем, ки дар он вақти плеерро сабт мекунем. Мо онро ба ҳама субъектҳое илова кардем, ки ҷуброни таъхирро талаб мекунанд (снарядҳо, қобилиятҳо ва ғайра). Пеш аз он ки мо коркарди ин гуна объектҳоро оғоз кунем, мо онҳоро то ин вақт кластер мекунем ва якҷоя коркард мекунем, ҷаҳони физикиро барои ҳар як кластер як маротиба бармегардонем.

Дар ин марҳила мо як системаи умумии кор. Рамзи он дар шакли каме соддакардашуда:

public sealed class LagCompensationSystemGroup : ExecutableSystem
{
     //Машина времени
     private readonly ITimeMachine _timeMachine;

     //Набор систем лагкомпенсации
     private readonly LagCompensationSystem[] _systems;
     
     //Наша реализация кластеризатора
     private readonly TimeTravelMap _travelMap = new TimeTravelMap();

    public LagCompensationSystemGroup(ITimeMachine timeMachine, 
        LagCompensationSystem[] lagCompensationSystems)
     {
         _timeMachine = timeMachine;
         _systems = lagCompensationSystems;
     }

     public override void Execute(GameState gs)
     {
         //На вход кластеризатор принимает текущее игровое состояние,
         //а на выход выдает набор «корзин». В каждой корзине лежат энтити,
         //которым для лагкомпенсации нужно одно и то же время из истории.
         var buckets = _travelMap.RefillBuckets(gs);

         for (int bucketIndex = 0; bucketIndex < buckets.Count; bucketIndex++)
         {
             ProcessBucket(gs, buckets[bucketIndex]);
         }

         //В конце лагкомпенсации мы восстанавливаем физический мир 
         //в исходное состояние
         _timeMachine.TravelToTime(gs.Time);
     }

     private void ProcessBucket(GameState presentState, TimeTravelMap.Bucket bucket)
     {
         //Откатываем время один раз для каждой корзины
         var pastState = _timeMachine.TravelToTime(bucket.Time);

         foreach (var system in _systems)
         {
               system.PastState = pastState;
               system.PresentState = presentState;

               foreach (var entity in bucket)
               {
                   system.Execute(entity);
               }
          }
     }
}

Танҳо он чизе, ки боқӣ монд, танзим кардани тафсилот буд:

1. Фаҳмед, ки масофаи максималии ҳаракатро дар вақт чӣ қадар маҳдуд кардан лозим аст.

Барои мо муҳим буд, ки бозӣ то ҳадди имкон дастрас дар шароити шабакаҳои мобилии суст, бинобар ин мо ҳикояро бо маржаи 30 тик (бо суръати 20 Гц) маҳдуд кардем. Ин ба бозигарон имкон медиҳад, ки ҳатто дар пингҳои хеле баланд ба рақибон зарба зананд.

2. Муайян кунед, ки кадом предметҳоро дар вақташ кӯчондан мумкин аст ва кадоме наметавонанд.

Мо, албатта, харифони худро харакат карда истодаем. Аммо сипарҳои энергетикии насбшаванда, масалан, нестанд. Мо қарор додем, ки беҳтар аст, ки ба қобилияти муҳофизатӣ афзалият диҳем, чунон ки аксар вақт дар тирандозҳои онлайн анҷом дода мешавад. Агар бозигар аллакай сипарро дар айни замон гузошта бошад, тирҳои ҷуброни ақибмонда аз гузашта набояд аз он парвоз кунанд.

3. Қарор кунед, ки қобилияти ҷуброн кардани қобилияти динозаврҳо зарур аст: газидан, зарба задани дум ва ғайра. Мо қарор додем, ки чӣ лозим буд ва онҳоро мувофиқи ҳамон қоидаҳое, ки тирҳо доранд, коркард мекунем.

4. Муайян кунед, ки бо коллайдерҳои плеер, ки барои онҳо ҷуброни ақибмонда анҷом дода мешавад, чӣ кор кардан лозим аст. Ба таври хуб, мавқеи онҳо набояд ба гузашта гузарад: бозигар бояд худро дар ҳамон вақт бинад, ки ҳоло дар сервер аст. Бо вуҷуди ин, мо инчунин коллайдерҳои бозигари тирандозиро бармегардонем ва ин якчанд сабаб дорад.

Аввалан, он кластеризатсияро беҳтар мекунад: мо метавонем як ҳолати физикиро барои ҳамаи бозигароне, ки пингҳои наздик доранд, истифода барем.

Дуюм, дар ҳама рейкастҳо ва такрорҳо мо ҳамеша коллайдерҳои плеерро, ки қобилият ё снаряд доранд, истисно мекунем. Дар Dino Squad, бозигарон динозаврҳоро назорат мекунанд, ки аз рӯи стандартҳои тирандозӣ геометрияи ғайристандартӣ доранд. Ҳатто агар плеер бо кунҷи ғайриоддӣ тир парронад ва траекторияи тир аз коллайдери динозаври плеер гузарад, тир ба он аҳамият намедиҳад.

Сеюм, мо мавқеи силоҳи динозавр ё нуқтаи истифодаи қобилиятро бо истифода аз маълумот аз ECS ҳатто пеш аз оғози ҷуброни ақибмонӣ ҳисоб мекунем.

Дар натиҷа, мавқеи воқеии коллайдерҳои бозигари ақибмонда барои мо муҳим нест, бинобар ин мо роҳи пурсамартар ва дар айни замон соддатарро пеш гирифтем.

Таъхири шабакаро танҳо нест кардан мумкин нест, онро танҳо ниқоб кардан мумкин аст. Мисли ҳама гуна усулҳои дигари пинҳонкорӣ, ҷуброни ақибмонии сервер бартариятҳои худро дорад. Он таҷрибаи бозии бозигареро, ки аз ҳисоби плеери тирандозӣ тирпарронӣ мекунад, беҳтар мекунад. Аммо барои Dino Squad, интихоби ин ҷо аён буд.

Албатта, ҳамаи ин бояд аз ҳисоби мураккабии афзояндаи коди сервер дар маҷмӯъ пардохт карда шавад - ҳам барои барномасозон ва ҳам тарроҳони бозӣ. Агар пештар симулятсия занги оддии пайдарпайи системаҳо бошад, пас бо ҷуброни ақибмонӣ дар он ҳалқаҳо ва шохаҳои лона пайдо шуданд. Барои он ки барои кор бо он қулай бошад, мо низ кӯшиши зиёд сарф кардем.

Дар версияи 2019 (ва шояд каме пештар), Unity дастгирии пурраи саҳнаҳои физикии мустақилро илова кард. Мо онҳоро қариб дарҳол пас аз навсозӣ дар сервер татбиқ кардем, зеро мо мехостем, ки аз ҷаҳони физикӣ, ки барои ҳама ҳуҷраҳо маъмул аст, зуд халос шавем.

Мо ба ҳар як утоқи бозӣ саҳнаи ҷисмонии худро додем ва ҳамин тавр пеш аз ҳисоб кардани симулятсия зарурати «тоза кардани» саҳнаро аз маълумоти утоқи ҳамсоя бартараф кардем. Якум, ин боиси хеле баланд шудани хосилнокии мехнат гардид. Дуюм, он имкон дод, ки аз як синфи тамоми хатогиҳо, ки агар барномасоз ҳангоми илова кардани унсурҳои нави бозӣ дар коди тозакунии саҳна хато кунад, бартараф карда шавад. Чунин хатогиҳоро ислоҳ кардан душвор буд ва онҳо аксар вақт ба ҳолати объектҳои физикӣ дар саҳнаи як ҳуҷра ба ҳуҷраи дигар «чоридани» оварда мерасонанд.

Илова бар ин, мо баъзе тадқиқот анҷом додем, ки оё саҳнаҳои физикиро барои нигоҳ доштани таърихи ҷаҳони ҷисмонӣ истифода бурдан мумкин аст. Яъне шартан ба ҳар як ҳуҷра на як саҳна, балки 30 саҳна ҷудо кунед ва аз онҳо буфери даврӣ созед, ки дар он ҳикоя нигоҳ дошта шавад. Умуман, вариант кор мекард, аммо мо онро ба амал наовардем: вай ягон афзоиши девонавори хосилнокии мехнатро нишон надод, балки дигаргунихои хеле хавфнокро талаб мекард. Пешгӯӣ кардан душвор буд, ки сервер ҳангоми кор бо ин қадар саҳнаҳо чӣ гуна рафтор мекунад. Аз ин рӯ, мо қоидаро риоя кардем: "Агар он вайрон нашавад, онро ислоҳ накунед".

Манбаъ: will.com

Илова Эзоҳ