Momwe tidalimbikitsira makina owerengera ma ballistic a chowombera cham'manja ndi network latency compensation algorithm

Momwe tidalimbikitsira makina owerengera ma ballistic a chowombera cham'manja ndi network latency compensation algorithm

Moni, ndine Nikita Brizhak, wopanga seva ku Pixonic. Lero ndikufuna kulankhula za kubweza kwa lag mu mafoni ambiri.

Zolemba zambiri zalembedwa zokhuza kubweza kwa seva, kuphatikiza mu Chirasha. Izi sizosadabwitsa, chifukwa ukadaulo uwu wagwiritsidwa ntchito mwachangu popanga ma FPS ambiri kuyambira kumapeto kwa 90s. Mwachitsanzo, mutha kukumbukira QuakeWorld mod, yomwe inali imodzi mwa oyamba kuigwiritsa ntchito.

Timagwiritsanso ntchito pamasewera athu owombera ambiri a Dino squad.

M'nkhaniyi, cholinga changa sikubwereza zomwe zalembedwa kale kambirimbiri, koma kunena momwe tidathandizira kubweza ngongole pamasewera athu, poganizira zaukadaulo wathu komanso mawonekedwe amasewera.

Mawu ochepa okhudza cortex yathu ndi ukadaulo.

Dino Squad ndiwowombera pa intaneti wa PvP. Osewera amawongolera ma dinosaurs okhala ndi zida zosiyanasiyana ndikumenyana m'magulu a 6v6.

Onse kasitomala ndi seva amachokera ku Unity. Zomangamanga ndizapamwamba kwambiri kwa owombera: seva ndi yaulamuliro, ndipo kulosera kwa kasitomala kumagwira ntchito kwa makasitomala. Kuyerekezera kwamasewera kumalembedwa pogwiritsa ntchito ECS m'nyumba ndipo imagwiritsidwa ntchito pa seva ndi kasitomala.

Ngati ndi nthawi yoyamba kuti mumve za chipukuta misozi, nayi ulendo wachidule wokhudza nkhaniyi.

M'masewera a FPS ambiri, masewerawa nthawi zambiri amafaniziridwa pa seva yakutali. Osewera amatumiza zomwe alowetsa (zambiri za makiyi osindikizidwa) ku seva, ndipo poyankha seva imawatumizira masewera osinthidwa poganizira zomwe adalandira. Ndi chiwembu cholumikizira ichi, kuchedwa pakati pa kukanikiza kiyi yopita patsogolo ndi mphindi yomwe wosewera akuyenda pa zenera kudzakhala kwakukulu kuposa ping.

Ngakhale pamanetiweki amderali kuchedwa uku (komwe kumadziwika kuti input lag) kungakhale kosazindikirika, mukamasewera pa intaneti kumapangitsa kuti munthu amve "kutsetsereka" powongolera munthu. Vutoli ndilofunika kawiri pamanetiweki am'manja, pomwe vuto ngati ping ya wosewera ndi 200 ms imawonedwabe ngati kulumikizana kwabwino kwambiri. Nthawi zambiri ping imatha kukhala 350, 500, kapena 1000 ms. Kenako zimakhala zosatheka kusewera chowombelera mwachangu ndi lag yolowera.

Njira yothetsera vutoli ndikulosera kwa kasitomala kumbali. Apa kasitomala mwiniwakeyo amagwiritsa ntchito zolowera kwa wosewera mpira, popanda kuyembekezera yankho kuchokera kwa seva. Ndipo yankho likalandiridwa, limangofanizira zotsatira ndikusintha malo otsutsa. Kuchedwa pakati pa kukanikiza kiyi ndi kuwonetsa zotsatira pazenera pankhaniyi ndikochepa.

Ndikofunika kumvetsetsa nuance apa: kasitomala nthawi zonse amadzikoka yekha malinga ndi zomwe alowetsamo, ndi adani - ndi kuchedwa kwa maukonde, malinga ndi dziko lapitalo kuchokera ku data kuchokera ku seva. Ndiko kuti, powombera mdani, wosewera mpira amamuwona kale wachibale wake. Zambiri zolosera za kasitomala tinalemba kale.

Choncho, kuneneratu kwa kasitomala kumathetsa vuto limodzi, koma kumapanga lina: ngati wosewera mpira akuwombera pamalo omwe mdani analipo kale, pa seva pamene akuwombera pa malo omwewo, mdani sangakhalenso pamalo amenewo. Kubwezera kwa seva kumayesa kuthetsa vutoli. Chida chikawomberedwa, seva imabwezeretsanso mawonekedwe amasewera omwe wosewerayo adawona komweko panthawi yomwe adawombera, ndikuwunika ngati akadagunda mdaniyo. Ngati yankho liri "inde," kugunda kumawerengedwa, ngakhale mdani salinso pa seva panthawiyo.

Pokhala ndi chidziwitso ichi, tinayamba kugwiritsa ntchito malipiro a seva ku Dino Squad. Choyamba, tidayenera kumvetsetsa momwe tingabwezeretsere pa seva zomwe kasitomala adawona? Ndipo nchiyani kwenikweni chimene chiyenera kubwezeretsedwa? M'masewera athu, kumenyedwa kwa zida ndi kuthekera kumawerengeredwa kudzera pamiyala ndi zokutira - ndiye kuti, kudzera mukuchita zinthu ndi zida za mdani. Chifukwa chake, tidafunikira kutulutsanso malo omwe adawombana awa, omwe osewera "adawona" kwanuko, pa seva. Panthawiyo tinkagwiritsa ntchito mtundu wa Unity 2018.x. Physics API yomwe ilipo ndi yokhazikika, dziko lakuthupi limapezeka mukope limodzi. Palibe njira yopulumutsira dziko lake ndikubwezeretsanso kuchokera m'bokosi. Ndiye titani?

Yankho linali pamwamba; zinthu zake zonse zinali zitagwiritsidwa ntchito kale ndi ife kuthetsa mavuto ena:

  1. Kwa kasitomala aliyense, tiyenera kudziwa nthawi yomwe adawona otsutsa pamene adasindikiza makiyi. Talemba kale izi mu phukusi lolowetsamo ndipo tazigwiritsa ntchito kuti tisinthe kulosera kwa kasitomala.
  2. Tiyenera kusunga mbiri yakale yamasewera. Ndi momwemo kuti tidzagwira maudindo a otsutsa athu (ndipo chifukwa chake omenyana nawo). Tinali kale ndi mbiri ya boma pa seva, tinaigwiritsa ntchito pomanga deltas. Podziwa nthawi yoyenera, titha kupeza mosavuta chikhalidwe choyenera m'mbiri.
  3. Tsopano popeza tili ndi gawo lamasewera kuchokera ku mbiri yakale m'manja, tikuyenera kulumikiza deta ya osewera ndi momwe dziko lilili. Zolumikizana zomwe zilipo - sunthani, zosowa - pangani, zosafunikira - wonongani. Mfundo iyi idalembedwanso kale ndipo inali ndi machitidwe angapo a ECS. Tidagwiritsa ntchito zipinda zingapo zamasewera munjira imodzi ya Unity. Ndipo popeza dziko lowoneka ndi limodzi panjira iliyonse, idayenera kugwiritsidwanso ntchito pakati pa zipinda. Tisanachite chilichonse chofananira, "tikakhazikitsanso" momwe dziko lilili ndikuliyambitsanso ndi data ya chipinda chomwe chilipo, kuyesa kugwiritsanso ntchito zinthu zamasewera a Unity momwe tingathere kudzera munjira yanzeru yolumikizirana. Chomwe chinatsala chinali kuyitanitsa malingaliro omwewo pamasewera am'mbuyomu.

Pophatikiza zinthu zonsezi, tili ndi "makina anthawi" omwe amatha kubweza zomwe zikuchitika padziko lapansi nthawi yoyenera. Khodiyo idakhala yosavuta:

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;
     }
}

Chomwe chinatsala chinali kudziwa momwe angagwiritsire ntchito makinawa kuti athe kulipira mosavuta kuwombera ndi luso.

Munthawi yophweka, makina akamakhazikitsidwa pa hitscan imodzi, zonse zimawoneka zomveka: wosewerayo asanawombera, amayenera kubweza dziko lapansi momwe akufunira, kupanga raycast, kuwerengera kugunda kapena kuphonya, ndi kubwezeretsa dziko ku chikhalidwe choyambirira.

Koma pali makina ochepera otere mu Dino squad! Zida zambiri pamasewera zimapanga ma projectiles - zipolopolo zanthawi yayitali zomwe zimawulukira nkhupakupa zingapo (nthawi zina, nkhupakupa zambiri). Chochita nawo, nthawi yanji ayenera kuwuluka?

Π’ nkhani yakale za Half-Life network stack, anyamata ochokera ku Valve adafunsanso funso lomwelo, ndipo yankho lawo linali ili: chipukuta misozi cha projectile ndizovuta, ndipo ndi bwino kuzipewa.

Tinalibe njira iyi: zida zopangira projectile zinali mbali yofunika kwambiri pakupanga masewera. Choncho tinayenera kubwera ndi chinachake. Pambuyo pokambirana pang'ono, tinapanga njira ziwiri zomwe zimawoneka kuti zikugwira ntchito:

1. Timamanga projectile ku nthawi ya wosewera mpira amene adayipanga. Kuyerekeza kulikonse kwa seva, pa chipolopolo chilichonse cha wosewera aliyense, timabweza dziko lapansi kudziko lamakasitomala ndikuwerengera kofunikira. Njirayi idapangitsa kuti zikhale zotheka kukhala ndi katundu wogawidwa pa seva ndi nthawi yodziwikiratu yowuluka ya projectiles. Kuneneratu kunali kofunikira makamaka kwa ife, popeza tili ndi ma projectiles onse, kuphatikiza ma projectiles a adani, omwe adaneneratu pa kasitomala.

Momwe tidalimbikitsira makina owerengera ma ballistic a chowombera cham'manja ndi network latency compensation algorithm
Pachithunzichi, wosewera pa Tick 30 amawombera mzinga moyembekezera: amawona komwe mdani akuthamangira ndipo amadziwa pafupifupi liwiro la mzinga. Kumeneko akuwona kuti wagunda chandamale pa 33rd. Chifukwa cha chipukuta misozi, idzawonekeranso pa seva

2. Timachita zonse mofanana ndi njira yoyamba, koma, titawerengera nkhupakupa imodzi ya chiwongolero cha chipolopolo, sitimayima, koma pitirizani kuyerekezera kuthawa kwake mkati mwa seva yomweyi, nthawi iliyonse kubweretsa nthawi yake pafupi ndi seva. tikiti imodzi ndi imodzi ndikusintha malo ogundana. Timachita izi mpaka chimodzi mwa zinthu ziwiri zitachitika:

  • Chipolopolo chatha. Izi zikutanthauza kuti kuwerengera kwatha, tikhoza kuwerengera kuphonya kapena kugunda. Ndipo izi ndi zomwe zidawombera mfutiyo! Kwa ife izi zinali zonse kuphatikiza ndi kuchotsera. Kuphatikiza - chifukwa kwa wosewera mpira izi zimachepetsa kwambiri kuchedwa pakati pa kugunda ndi kuchepa kwa thanzi la mdani. Choyipa chake ndikuti zotsatira zomwezo zidawonedwa pamene otsutsa adawombera wosewera mpira: mdani, zikuwoneka, adangowombera rocket pang'onopang'ono, ndipo kuwonongeka kudawerengedwa kale.
  • Chipolopolo chafika pa nthawi ya seva. Pankhaniyi, kayeseleledwe ake adzapitirira mu lotsatira seva Mafunso Chongani popanda kubweza chipukuta misozi. Kwa ma projectile oyenda pang'onopang'ono, izi zitha kuchepetsa kuchuluka kwa ma physics rollbacks poyerekeza ndi njira yoyamba. Pa nthawi yomweyo, katundu wosagwirizana pa kayeseleledwe anawonjezeka: seva mwina alibe, kapena pa seva imodzi tick anali kuwerengetsa khumi ndi awiri kayeseleledwe nkhupakupa zipolopolo angapo.

Momwe tidalimbikitsira makina owerengera ma ballistic a chowombera cham'manja ndi network latency compensation algorithm
Zomwezo monga momwe zilili pachithunzi chapitachi, koma zowerengedwa molingana ndi chiwembu chachiwiri. Mzinga "unagwidwa" ndi nthawi ya seva panthawi yomweyi yomwe kuwombera kunachitika, ndipo kugunda kungathe kuwerengedwa mwamsanga ngati tick yotsatira. Pa 31st tick, pamenepa, chiwongola dzanja sichikugwiritsidwanso ntchito

Pakukhazikitsa kwathu, njira ziwirizi zidasiyana m'mizere ingapo ya ma code, kotero tidapanga zonse ziwiri, ndipo kwa nthawi yayitali zidakhalapo zofanana. Kutengera ndi makina a chida komanso liwiro la chipolopolocho, tidasankha njira imodzi kapena ina pa dinosaur iliyonse. Chosinthira apa chinali mawonekedwe amasewera amakanika monga "ngati mutagunda mdani nthawi zambiri munthawi yakuti ndi yakuti, pezani bonasi yakuti ndi yakuti." Makanika aliwonse pomwe nthawi yomwe wosewera adagunda adani adachita mbali yofunika adakana kugwira ntchito ndi njira yachiwiri. Kotero ife tinatsiriza kupita ndi njira yoyamba, ndipo tsopano ikugwiritsidwa ntchito ku zida zonse ndi mphamvu zonse zogwira ntchito pamasewera.

Payokha, ndikofunikira kukweza nkhani ya magwiridwe antchito. Ngati mumaganiza kuti zonsezi zingachedwetse zinthu, ndikuyankha: ndi. Umodzi ndi wodekha posuntha zogundana ndikuzitsegula ndi kuzimitsa. Mu Dino Squad, muzochitika "zoyipa kwambiri", patha kukhala mazana angapo opanga ma projectile omwe amapezeka nthawi imodzi pomenya nkhondo. Kusuntha ma colliders kuti muwerenge pulojekiti iliyonse payekha ndi chinthu chamtengo wapatali chosatheka. Chifukwa chake, kunali kofunikira kuti tichepetse kuchuluka kwa "rollback" yafizikiki. Kuti tichite izi, tidapanga gawo lina mu ECS momwe timajambulira nthawi ya osewera. Tidawonjeza ku mabungwe onse omwe amafunikira chipukuta misozi (zolinga, luso, ndi zina). Tisanayambe kukonza mabungwe oterowo, timawaphatikiza pofika nthawi ino ndikuwakonza palimodzi, kubweza dziko lenileni kamodzi pagulu lililonse.

Pakadali pano tili ndi dongosolo lomwe limagwira ntchito. Khodi yake m'njira yosavuta:

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);
               }
          }
     }
}

Zomwe zidatsala ndikukonza tsatanetsatane:

1. Kumvetsetsa kuchuluka kwa kuchepetsa mtunda wautali wa kuyenda mu nthawi.

Zinali zofunikira kwa ife kuti masewerawa azitha kupezeka mosavuta m'malo opanda maukonde am'manja, chifukwa chake tidachepetsa nkhaniyo ndi nkhupakupa 30 (ndi tick rate 20 Hz). Izi zimathandiza osewera kugunda otsutsa ngakhale pa pings kwambiri.

2. Dziwani kuti ndi zinthu ziti zomwe zingasunthidwe munthawi yake komanso zomwe sizingasunthidwe.

Ife, ndithudi, tikusuntha otsutsa athu. Koma zishango zamphamvu zokhazikika, mwachitsanzo, sizili. Tinaganiza kuti ndi bwino kuika patsogolo luso lodzitchinjiriza, monga momwe zimachitikira pa owombera pa intaneti. Ngati wosewerayo wayika kale chishango pakadali pano, zipolopolo zolipiridwa ndi lag zakale zisawuluke.

3. Sankhani ngati kuli koyenera kubwezera luso la ma dinosaur: kuluma, kugunda mchira, ndi zina zotero. Tinasankha zomwe zimafunika ndikuzikonza motsatira malamulo omwewo monga zipolopolo.

4. Dziwani chochita ndi colliders wa wosewera mpira amene kwachedwa chipukuta misozi ikuchitika. Mwanjira yabwino, malo awo sayenera kusinthira zakale: wosewera mpira ayenera kudziwona munthawi yomwe ali pa seva. Komabe, timabwezeranso zomwe zimawombana ndi wosewera mpira, ndipo pali zifukwa zingapo za izi.

Choyamba, zimathandizira kusanja: titha kugwiritsa ntchito mawonekedwe ofanana kwa osewera onse omwe ali ndi ma pings oyandikira.

Kachiwiri, pamawonekedwe onse ndi zophatikizika nthawi zonse timapatula osewera omwe ali ndi luso kapena ma projectiles. Mu Dino squad, osewera amawongolera ma dinosaurs, omwe ali ndi geometry yosagwirizana ndi zowombera. Ngakhale wosewera mpirawo atawombera mosiyanasiyana ndipo njira ya chipolopoloyo ikadutsa pagundana la dinosaur la wosewerayo, chipolopolocho sichinyalanyaza.

Chachitatu, timawerengera malo a chida cha dinosaur kapena momwe tingagwiritsire ntchito luso logwiritsa ntchito deta kuchokera ku ECS ngakhale chiwongoladzanja chisanayambe.

Chotsatira chake, malo enieni a colliders a lag-compensated player ndi osafunika kwa ife, kotero tinatenga njira yopindulitsa komanso nthawi yomweyo yosavuta.

Network latency siyingachotsedwe, imatha kubisika. Monga njira ina iliyonse yodzibisira, kubweza kwa seva kumakhala ndi malonda ake. Iwo bwino Masewero zinachitikira wosewera mpira amene kuwombera pa ndalama wosewera mpira akuwomberedwa pa. Kwa Dino squad, komabe, kusankha apa kunali koonekeratu.

Zachidziwikire, zonsezi zinayeneranso kulipiridwa chifukwa cha kuchuluka kwa ma code a seva - onse kwa opanga mapulogalamu ndi opanga masewera. Ngati m'mbuyomu kuyerekezera kunali kuyitanira kosavuta kwa machitidwe, ndiye kuti ndi kubweza kwanthawi yayitali, malupu okhala ndi zisa ndi nthambi zidawonekera mmenemo. Tinayesetsanso kuchita khama kwambiri kuti tikhale omasuka kugwira nawo ntchito.

Mu mtundu wa 2019 (ndipo mwina kale pang'ono), Unity idawonjezera chithandizo chokwanira pazithunzi zodziyimira pawokha. Tidawagwiritsa ntchito pa seva atangotsala pang'ono kusinthidwa, chifukwa tinkafuna kuchotsa dziko lakuthupi lodziwika bwino m'zipinda zonse.

Tidapatsa chipinda chilichonse chamasewera chomwe chili chake ndipo potero tidachotsa kufunika "kochotsa" zomwe zidachitika m'chipinda choyandikana ndi chipindacho tisanawerengere. Choyamba, zinapereka kuwonjezeka kwakukulu kwa zokolola. Kachiwiri, zidapangitsa kuti zitheke kuchotsa gulu lonse la nsikidzi zomwe zidawuka ngati wopanga mapulogalamu adalakwitsa pama code oyeretsa powonjezera zinthu zatsopano zamasewera. Zolakwa zoterozo zinali zovuta kuthetsa, ndipo nthawi zambiri zinkachititsa kuti zinthu zakuthupi zikhale m'chipinda chimodzi "zikuyenda" m'chipinda china.

Kuphatikiza apo, tidachita kafukufuku wowona ngati zowoneka bwino zitha kugwiritsidwa ntchito kusunga mbiri yachilengedwe. Ndiko kuti, mokhazikika, musagawire chiwonetsero chimodzi kuchipinda chilichonse, koma zithunzi 30, ndikupanga chotchingira chozungulira, momwe mungasungire nkhaniyo. Mwambiri, chisankhocho chidakhala chikugwira ntchito, koma sitinachigwiritse ntchito: sichinawonetse kuwonjezeka kwamisala, koma kumafuna kusintha kowopsa. Zinali zovuta kuneneratu momwe seva ingakhalire ikugwira ntchito kwa nthawi yayitali ndi zochitika zambiri. Chifukwa chake, tidatsatira lamulo: "Ngati sinaswe, osakonza".

Source: www.habr.com

Kuwonjezera ndemanga