Magadzirisiro atakaita mechanics ekuverenga ballistic kune mobile shooter ine network latency compensation algorithm.

Magadzirisiro atakaita mechanics ekuverenga ballistic kune mobile shooter ine network latency compensation algorithm.

Mhoroi, ini ndini Nikita Brizhak, mugadziri weserver kubva kuPixonic. Nhasi ndinoda kutaura nezve kubhadharira lag mune mobile multiplayer.

Zvinyorwa zvakawanda zvakanyorwa nezve server lag muripo, kusanganisira muchiRussia. Izvi hazvishamise, sezvo tekinoroji iyi yakashandiswa zvakanyanya mukugadzirwa kwevazhinji FPS kubva mukupera kwema90s. Semuenzaniso, unogona kuyeuka iyo QuakeWorld mod, yaive imwe yekutanga kuishandisa.

Isu tinoishandisa zvakare mune yedu nhare yevazhinji yekupfura Dino squad.

Muchinyorwa chino, chinangwa changu hachisi chekudzokorora izvo zvakatonyorwa kane chiuru, asi kutaura mashandisiro atakaita muripo wekusarira mumutambo wedu, tichifunga nezve tekinoroji yedu uye epakati gameplay maficha.

Mazwi mashoma nezve cortex yedu uye tekinoroji.

Dino squad ndeye network nhare PvP shooter. Vatambi vanodzora madinosaurs akashongedzerwa nezvombo zvakasiyana uye vanorwa mumwe nemumwe muzvikwata zve6v6.

Zvese zviri zviviri mutengi uye sevha zvinoenderana neKubatana. Iyo dhizaini ndeyemhando yepamusoro kune vanopfura: sevha ine chiremera, uye kufanotaura kwevatengi kunoshanda pane vatengi. Mutambo wekufananidza wakanyorwa uchishandisa mukati meimba ECS uye unoshandiswa pane zvese sevha uye mutengi.

Kana aka kari kekutanga kunzwa nezve lag muripo, heino rwendo rupfupi munyaya iyi.

Mumitambo yeFPS yevazhinji, mutambo wacho unowanzo edzerwa pane iri kure server. Vatambi vanotumira yavo yekuisa (ruzivo nezve makiyi akatsikirirwa) kune server, uye mukupindura sevha inovatumira yakagadziridzwa mamiriro emutambo ichifunga nezve data rakagamuchirwa. Nechirongwa chekudyidzana ichi, kunonoka pakati pekudzvanya kiyi yekumberi uye nguva iyo mutambi anofamba pachiratidziro inogara yakakura kupfuura ping.

Ndichiri pamanetiweki emunharaunda uku kunonoka (kunonyanyozivikanwa kunonzi input lag) kunogona kunge kusingaonekwe, kana uchitamba neInternet zvinounza kunzwa "kutsvedza pachando" paunenge uchidzora hunhu. Dambudziko iri rakapetwa kaviri kune nharembozha, uko nyaya kana ping yemutambi iri 200 ms ichiri kutorwa seyakanakisa kubatana. Kazhinji ping inogona kuva 350, 500, kana 1000 ms. Ipapo zvinobva zvaita zvisingaite kutamba inokurumidza kupfura nekuisa lag.

Mhinduro yedambudziko iri ndeye mutengi-divi simulation kufanotaura. Pano mutengi pachayo anoshandisa iyo inopinza kune mutambi hunhu, pasina kumirira mhinduro kubva kune server. Uye kana mhinduro ikagamuchirwa, inongoenzanisa mhedzisiro uye inovandudza nzvimbo dzevanopikisa. Kunonoka pakati pekudzvanya kiyi uye kuratidza mhedzisiro pachiratidziro mune iyi kesi kushoma.

Izvo zvakakosha kuti unzwisise nuance pano: mutengi anogara achizvikwevera zvichienderana neayo yekupedzisira, uye vavengi - nekunonoka kwenetiweki, zvinoenderana neyakapfuura mamiriro kubva kune data kubva kune server. Ndiko kuti, pakupfura muvengi, mutambi anomuona munguva yakapfuura hama yake. Zvimwe pamusoro pekufanotaura kwevatengi takanyora kare.

Saka, kufanotaura kwevatengi kunogadzirisa dambudziko rimwe, asi rinogadzira rimwe: kana mutambi akapfura panzvimbo iyo muvengi aive munguva yakapfuura, pane sevha kana achipfura panzvimbo imwe chete, muvengi anogona kunge asisiri panzvimbo iyoyo. Server lag compensation inoedza kugadzirisa dambudziko iri. Kana chombo chapfurwa, sevha inodzoreredza mamiriro emutambo uyo mutambi akaona munharaunda panguva yekupfurwa, uye anotarisa kana angave akarova muvengi. Kana mhinduro iri "hongu," kurova kunoverengwa, kunyangwe muvengi asisipo pane server panguva iyoyo.

Tine ruzivo urwu, takatanga kushandisa server lag muripo muDino squad. Chekutanga pane zvese, isu taifanira kunzwisisa nzira yekudzoreredza pane server zvakaonekwa nemutengi? Uye chii chaizvo chinoda kudzorerwa? Mumutambo wedu, kurova kubva kuzvombo uye kugona kunoverengerwa kuburikidza nemaraycasts uye pamusoro - ndiko kuti, kuburikidza nekudyidzana nevavengi venyama. Saizvozvo, taifanira kuburitsazve nzvimbo yeaya akapondera, ayo mutambi "akaona" munharaunda, paseva. Panguva iyoyo taishandisa Unity version 2018.x. Iyo fizikisi API iripo yakamira, nyika yenyama iripo mune imwe kopi. Iko hakuna nzira yekuchengetedza mamiriro ayo uye wozoidzosera kubva mubhokisi. Saka ndoita sei?

Mhinduro yaive pamusoro; zvese zvaro zvinhu zvaive zvatoshandiswa nesu kugadzirisa mamwe matambudziko:

  1. Kune mutengi wega wega, tinoda kuziva kuti inguvai yaakaona vanopikisa paakadzvanya makiyi. Isu takatonyora ruzivo urwu mupakeji yekuisa uye takaishandisa kugadzirisa fungidziro yemutengi.
  2. Tinofanira kukwanisa kuchengetedza nhoroondo yematunhu emitambo. Ndimo matiri isu tichabata zvinzvimbo zvevanotipikisa (uye nekudaro macolliders avo). Isu takanga tatova nenhoroondo yenyika pane server, takaishandisa kuvaka deltas. Kuziva nguva yakakodzera, taigona kuwana zviri nyore mamiriro ezvinhu munhoroondo.
  3. Zvino zvatine mamiriro emutambo kubva munhoroondo muruoko, isu tinofanirwa kukwanisa kuwiriranisa data yemutambi nemamiriro epasirese. Mabondera aripo - fambisa, asipo - gadzira, zvisina basa - paradza. Iyi pfungwa yaive yatonyorwa uye yaive ne akati wandei ECS masisitimu. Isu takaishandisa kubata akati wandei makamuri emitambo mune imwe Unity process. Uye sezvo nyika yenyama iri imwe pamaitiro, yaifanirwa kushandiswa zvakare pakati pemakamuri. Tisati tati rega rega rekufananidzira, isu "tinotangazve" mamiriro epasirese uye toitambazve nedata rekamuri iripo, tichiedza kushandisa zvakare Unity mutambo zvinhu zvakanyanya sezvinobvira kuburikidza nehungwaru hwekubatanidza system. Chakanga chasara kwaive kudaidza pfungwa imwechete yemutambo wenyika kubva kare.

Nekuisa zvese izvi zvinhu pamwechete, takawana "muchina wenguva" unogona kudzoreredza mamiriro epasirese kune iyo nguva chaiyo. Iyo kodhi yakave nyore:

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

Chaive chasara kwaive kufunga mashandisiro emuchina uyu kubhadhara mapfuti uye kugona.

Muchiitiko chakareruka, kana mechanics yakavakirwa pane imwechete hitscan, zvese zvinoita sezviri pachena: mutambi asati apfura, anofanirwa kudzosera nyika yenyama kune yaanoda, kuita raycast, kuverenga kurova kana kupotsa, uye. dzosera nyika kune yekutanga mamiriro.

Asi kune vashoma vakadaro makanika muDino squad! Zvizhinji zvezvombo zvemutambo zvinogadzira projectiles - mabara anogara kwenguva refu anobhururuka kune akati wandei ekuenzanisa zvikwekwe (mune dzimwe nguva, akawanda ezvikwekwe). Chii chekuita navo, inguvai yavanofanira kubhururuka?

В chinyorwa chekare nezve Half-Life network stack, vakomana veValve vakabvunza mubvunzo mumwe chete, uye mhinduro yavo yaiva iyi: projectile lag compensation inonetsa, uye zviri nani kuidzivisa.

Isu takanga tisina iyi sarudzo: projekiti-yakavakirwa zvombo zvaive chinhu chakakosha padhizaini yemutambo. Saka taifanira kuuya nechimwe chinhu. Mushure mekumwe kufunga, takagadzira sarudzo mbiri dzaiita sedzinoshanda:

1. Isu tinosunga projectile kusvika panguva yemutambi akaigadzira. Yese tiki ye server simulation, kune yega bara remutambi wega wega, isu tinodzosera nyika yemuviri kune yevatengi nyika uye kuita maverengero anodiwa. Iyi nzira yakaita kuti zvikwanise kuve nemutoro wakagovaniswa pane sevha uye inofanotaurwa nguva yekubhururuka yemapurojekiti. Kufanotaura kwainyanya kukosha kwatiri, sezvo isu tine zvese projectiles, kusanganisira muvengi projectiles, akafanotaurwa pamutengi.

Magadzirisiro atakaita mechanics ekuverenga ballistic kune mobile shooter ine network latency compensation algorithm.
Mumufananidzo, mutambi ari paTick 30 anopfura chombo achitarisira: anoona kuti muvengi ari kumhanya kupi uye anoziva kukurumidza kumhanya kwechombo. Kunzvimbo iyi anoona kuti akarova chinangwa pamakumi matatu nematatu. Kutenda kune lag compensation, ichaonekwawo pane server

2. Isu tinoita zvese zvakafanana neyekutanga sarudzo, asi, kana taverenga imwe tiki yebullet simulation, hatimire, asi ramba uchitevedzera kubhururuka kwayo mukati meiyo imwechete server tick, nguva imwe neimwe ichiunza nguva yayo pedyo neserver. chimwe nechimwe chikwekwe uye nekuvandudza nzvimbo dzekudhumhana. Tinoita izvi kusvikira chimwe chezvinhu zviviri zvaitika:

  • Bara rapera. Izvi zvinoreva kuti masvomhu apera, tinogona kuverenga kupotsa kana kurova. Uye izvi zviri panguva imwechete iyo pfuti yakapfurwa! Kwatiri izvi zvaingove zviri zviviri kuwedzera nekubvisa. A plus - nekuti kune mutambi wekupfura izvi zvakanyanya kuderedza kunonoka pakati pekurova uye kudzikira kwehutano hwemuvengi. Izvo zvakaderera ndezvekuti mhedzisiro imwechete yakaonekwa apo vapikisi vakapfura mutambi: muvengi, zvinoita sekunge, angoridza roketi inononoka, uye kukuvadzwa kwakange kwaverengwa.
  • Bara rasvika panguva yeseva. Muchiitiko ichi, kuenzanisa kwayo kunoenderera mberi mune inotevera server tick pasina chero lag muripo. Kune anononoka projectiles, izvi zvinogona ne theoretically kuderedza huwandu hwefizikisi rollbacks zvichienzaniswa neyekutanga sarudzo. Panguva imwecheteyo, iyo isina kuenzana mutoro pane yekufananidza yakawedzera: sevha ingave isina basa, kana mune imwe sevha tick yaive kuverenga gumi nemaviri ekuenzanisa matiki emabara akati wandei.

Magadzirisiro atakaita mechanics ekuverenga ballistic kune mobile shooter ine network latency compensation algorithm.
Mamiriro ezvinhu akafanana nemufananidzo wapfuura, asi akaverengerwa maererano nechirongwa chechipiri. Iyo missile "yakabatwa" nenguva yeseva panguva imwechete iyo pfuti yakaitika, uye kurova kunogona kuverengerwa nekukurumidza sekiki inotevera. Pa 31st tick, mune iyi kesi, lag compensation haichashandiswi

Mukuita kwedu, nzira mbiri idzi dzaingosiyana mumitsetse mishoma yekodhi, saka takagadzira ese ari maviri, uye kwenguva yakareba aivepo akafanana. Zvichienderana nemakanika echombo uye nekumhanya kwebhoti, isu takasarudza imwe kana imwe sarudzo kune yega yega dinosaur. Shanduko apa yaive yekuonekwa mumutambo wemakanika sekuti "kana ukarova muvengi kakawanda panguva yakadai, wana bhonasi." Chero makanika apo nguva iyo mutambi akarova muvengi akaita basa rinokosha yakaramba kushanda nenzira yechipiri. Saka takazopedzisira taenda neyekutanga sarudzo, uye ikozvino inoshanda kune zvese zvombo uye zvese zvinoshanda kugona mumutambo.

Kusiyana, zvakakodzera kusimudza nyaya yekushanda. Kana iwe waifunga kuti zvese izvi zvinononoka zvinhu, ini ndinopindura: ndizvo. Kubatana kunonoka kufambisa macolliders nekuabatidza nekudzima. MuDino squad, mune "yakaipisisa" kesi, panogona kuve nemazana akati wandei projectiles aripo panguva imwe chete muhondo. Kufambisa macollider kuverenga projekiti yega yega chinhu chisinga tengeke. Naizvozvo, zvaive zvakakodzera kuti tideredze huwandu hwefizikisi "rollbacks". Kuti tiite izvi, takagadzira chikamu chakasiyana muECS umo tinorekodha nguva yemutambi. Isu takaiwedzera kune ese masangano anoda lag muripo (mapurojekiti, kugona, nezvimwewo). Tisati tatanga kugadzirisa masangano akadai, tinoaunganidza panguva ino uye toagadzirisa pamwe chete, tichitenderedza nyika yenyama kamwe pasumbu rega rega.

Panguva ino tine hurongwa hunowanzoshanda. Kodhi yayo mune yakati rerutswa fomu:

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

Chakanga chasara ndechekugadzirisa ruzivo:

1. Nzwisisa kuti kudzikamisa kureba kwekufamba kwenguva.

Zvakanga zvakakosha kwatiri kuti tiite kuti mutambo usvike sezvinobvira mumamiriro ezvinhu asina kunaka nharembozha, saka takaganhura nyaya yacho nemuganho wemakumi matatu ematiki (netick rate ye30 Hz). Izvi zvinobvumira vatambi kurova vanopikisa kunyangwe pakakwirira pings.

2. Sarudza kuti ndezvipi zvinhu zvinogona kufambiswa nenguva uye izvo zvisingakwanisi.

Isu, chokwadi, tiri kufambisa vadzivisi vedu. Asi zvidziviriro zvesimba zvinogoneka, semuenzaniso, hazvisi. Isu takasarudza kuti zvaive nani kupa pamberi pekugona kudzivirira, sezvinowanzoitwa muvapfuri vepamhepo. Kana mutambi atoisa nhovo munguva ino, mabara akabhadharwa kubva kare haafaniri kubhururuka nawo.

3. Sarudza kana zvakakosha kubhadhara kukwanisa kwedinosaurs: kuruma, kurova kwemuswe, nezvimwewo. Takasarudza zvaidiwa uye tinozvigadzirisa maererano nemitemo yakafanana nemabara.

4. Sarudza zvokuita nemabondera emutambi ari kuitirwa muripo wakarebesa. Nenzira yakanaka, chinzvimbo chavo hachifanirwe kuchinjika mune yakapfuura: mutambi anofanira kuzviona iye panguva imwe chete iyo iye zvino ari pane sevha. Nekudaro, isu zvakare tinodzosera kumashure macolliders emutambi wekupfura, uye pane zvikonzero zvakati wandei zveizvi.

Kutanga, inovandudza kubatanidza: isu tinogona kushandisa yakafanana mamiriro emuviri kune vese vatambi vane pedyo pings.

Chechipiri, mune ese maraycasts uye anopindirana isu tinogara tisingasanganisire macollider emutambi ane hunyanzvi kana projectiles. MuDino squad, vatambi vanodzora madinosaurs, ayo ane asiri-yakajairwa geometry neanopfura zviyero. Kunyangwe mutambi akapfura nepakona isina kujairika uye gwara rebara richipfuura nemudhinasaro remutambi, bara rinofuratira.

Chechitatu, isu tinoverenga zvinzvimbo zvechombo chedinosaur kana poindi yekushandiswa kwekugona kushandisa data kubva kuECS kunyangwe kusati kwatanga kubhadharwa.

Nekuda kweizvozvo, iyo chaiyo chinzvimbo chemacolliders emutambi akatsiviwa-lag haina kukosha kwatiri, saka takatora nzira inobereka uye panguva imwe chete iri nyore.

Network latency haigone kungobviswa, inogona kungovharika. Kufanana neimwe nzira yekuvanza, server lag muripo ine tradeoffs yayo. Inovandudza ruzivo rwemutambo wemutambi ari kupfura nemari yemutambi ari kupfurwa. Kune Dino squad, zvisinei, sarudzo apa yaive pachena.

Ehe, zvese izvi zvakare zvaifanira kubhadharwa nekuwedzera kuomarara kwesevha kodhi yakazara - zvese zvevagadziri vepurogiramu uye vagadziri vemitambo. Kana pakutanga iyo simulation yaive yakapusa sequential kufona kwemasisitimu, saka nelag muripo, nested loops uye matavi akaonekwa mairi. Isu takashandisawo simba rakawanda kuti zviite nyore kushanda nazvo.

Muiyo 2019 vhezheni (uye pamwe zvishoma kumberi), Kubatana kwakawedzera rutsigiro rwakazara rwezvakazvimirira zvemuviri zviratidziro. Isu takaashandisa pane server nguva pfupi mushure mekuvandudzwa, nekuti isu taida kukurumidza kubvisa iyo yepanyama nyika yakajairika kumakamuri ese.

Isu takapa kamuri yega yega yemutambo chiitiko chayo uye nekudaro takabvisa kukosha kweku "kuchenesa" chiitiko kubva mudhata rekamuri yakavakidzana tisati taverenga simulation. Chekutanga, zvakapa kuwedzera kukuru mukubudirira. Chechipiri, zvakaita kuti zvibvire kubvisa kirasi yese yezvipembenene zvakamuka kana mugadziri akaita chikanganiso munzvimbo yekuchenesa kodhi paakawedzera zvinhu zvitsva zvemutambo. Kukanganisa kwakadaro kwaive kwakaoma kugadzirisa, uye kazhinji kwaikonzera mamiriro ezvinhu emuviri mune imwe kamuri chiitiko "kuyerera" mune imwe kamuri.

Pamusoro pezvo, takaita tsvakiridzo yekuona kana zviratidziro zvemuviri zvingashandiswa kuchengetedza nhoroondo yenyika. Kureva kuti, nemamiriro ezvinhu, kugovera kwete chiitiko chimwe kukamuri yega yega, asi makumi matatu, uye gadzira cyclic buffer kubva mazviri, mauri kuchengeta nyaya. Kazhinji, sarudzo yakazoshanda, asi isu hatina kuishandisa: haina kuratidza kuwedzera kwehupenzi mukubudirira, asi yaida shanduko dzine njodzi. Zvakanga zvakaoma kufanotaura kuti sevha yaizoita sei kana ichishanda kwenguva yakareba ine zviitiko zvakawanda. Naizvozvo, takatevedzera mutemo: “.Kana isina kutyorwa, usachigadzirisa".

Source: www.habr.com

Voeg