Mar a chuireamar feabhas ar mheicnic na n-áireamh ballistic do lámhachóir soghluaiste le algartam cúitimh latency líonra

Mar a chuireamar feabhas ar mheicnic na n-áireamh ballistic do lámhachóir soghluaiste le algartam cúitimh latency líonra

Dia duit, is mise Nikita Brizhak, forbróir freastalaí ó Pixonic. Sa lá atá inniu ba mhaith liom labhairt faoi aga moille san il-imreoir soghluaiste a chúiteamh.

Scríobhadh go leor alt faoi chúiteamh mhoillithe freastalaí, lena n-áirítear i Rúisis. Ní haon ionadh é seo, ós rud é gur úsáideadh an teicneolaíocht seo go gníomhach i gcruthú FPS il-imreora ó na 90í déanacha. Mar shampla, is féidir leat cuimhneamh ar an QuakeWorld mod, a bhí ar cheann de na chéad a úsáid.

Bainimid úsáid as freisin inár Scuad Dino shooter il-imreora soghluaiste.

San Airteagal seo, níl sé mar sprioc agam an méid atá scríofa míle uair cheana féin a athrá, ach a insint conas a chuireamar cúiteamh moillithe i bhfeidhm inár gcluiche, ag cur ár gcruach teicneolaíochta agus ár bpríomhghnéithe cluiche san áireamh.

Cúpla focal faoinár cortex agus ár dteicneolaíocht.

Is lámhachóir PvP soghluaiste líonra é Dino Squad. Rannpháirtithe a rialú dineasáir atá feistithe le héagsúlacht na n-arm agus troid lena chéile i bhfoirne 6v6.

Tá an cliant agus an freastalaí araon bunaithe ar Unity. Tá an ailtireacht clasaiceach go leor do lámhachóirí: tá an freastalaí authoritarian, agus oibríonn tuar cliant ar na cliaint. Scríobhtar an insamhalta cluiche ag baint úsáide as ECS intí agus úsáidtear é ar an bhfreastalaí agus ar an gcliant araon.

Más é seo an chéad uair a chuala tú faoi chúiteamh moille, seo chugat turas gairid ar an gceist.

I gcluichí CCT il-imreora, déantar an cluiche a insamhladh ar chianfhreastalaí de ghnáth. Cuireann imreoirí a n-ionchur (faisnéis faoi na heochracha brúite) chuig an bhfreastalaí, agus mar fhreagra cuireann an freastalaí staid chluiche nuashonraithe chucu ag cur na sonraí a fuarthas san áireamh. Leis an scéim idirghníomhaíochta seo, beidh an mhoill idir an eochair chun tosaigh a bhrú agus an nóiméad a bhogann carachtar an imreora ar an scáileán i gcónaí níos mó ná an ping.

Cé gur féidir an mhoill seo (ar a dtugtar moill ionchuir go coitianta) a bheith do-fheicthe ar líonraí áitiúla, nuair a bhíonn tú ag imirt tríd an Idirlíon cruthaíonn sé mothú “sleamhnú ar an oighear” agus carachtar á rialú. Tá an fhadhb seo faoi dhó ábhartha do líonraí móibíleacha, nuair a mheastar go bhfuil an cás nuair a bhíonn ping imreoir 200 ms fós ina nasc den scoth. Go minic is féidir leis an bping a bheith 350, 500, nó 1000 ms. Ansin bíonn sé beagnach dodhéanta shooter tapa a imirt le aga moille ionchuir.

Is é réiteach na faidhbe seo ná tuar insamhalta ar thaobh an chliaint. Anseo cuireann an cliant féin an t-ionchur i bhfeidhm ar charachtar an imreora, gan fanacht le freagra ón bhfreastalaí. Agus nuair a fhaightear an freagra, ní dhéanann sé ach na torthaí a chur i gcomparáid agus seasamh na bhfreasúra a nuashonrú. Is beag an mhoill idir eochair a bhrú agus an toradh a thaispeáint ar an scáileán sa chás seo.

Tá sé tábhachtach an nuance a thuiscint anseo: tarraingíonn an cliant é féin i gcónaí de réir a ionchur deireanach, agus naimhde - le moill líonra, de réir an stáit roimhe seo ó na sonraí ón bhfreastalaí. Is é sin, agus é ag lámhach ar namhaid, feiceann an t-imreoir é san am atá caite i gcoibhneas leis féin. Tuilleadh faoi thuar na gcliant scríobh muid níos luaithe.

Mar sin, réitíonn tuar na gcliant fadhb amháin, ach cruthaíonn sé fadhb eile: má shoots imreoir ag an bpointe ina raibh an namhaid san am atá caite, ar an bhfreastalaí nuair a lámhach ag an bpointe céanna, d'fhéadfadh an namhaid a bheith san áit sin a thuilleadh. Déanann cúiteamh mhoillithe freastalaí iarracht an fhadhb seo a réiteach. Nuair a scaoiltear arm, déanann an freastalaí an staid chluiche a chonaic an t-imreoir go háitiúil tráth an lámhaigh a athbhunú, agus seiceálann sé an bhféadfadh sé an namhaid a bhuail i ndáiríre. Más é an freagra "tá," déantar an t-amas a chomhaireamh, fiú mura bhfuil an namhaid ar an bhfreastalaí ag an bpointe sin a thuilleadh.

Agus an t-eolas seo á fháil againn, thosaigh muid ag cur i bhfeidhm cúiteamh moillithe freastalaí i Dino Squad. Ar an gcéad dul síos, bhí orainn a thuiscint conas a chur ar ais ar an bhfreastalaí cad a chonaic an cliant? Agus cad go díreach is gá a athchóiriú? Inár gcluiche, déantar amas ó airm agus cumais a ríomh trí chraoltaí ray agus forleagan - is é sin, trí idirghníomhaíochtaí le imbhuailteoirí fisiceacha an namhaid. Dá réir sin, b'éigean dúinn suíomh na n-imbhuailteoirí seo a “fheiceáil” go háitiúil, a atáirgeadh ar an bhfreastalaí. Ag an am sin bhí muid ag baint úsáide as Unity leagan 2018.x. Tá an API fisice ann statach, tá an domhan fisiceach i gcóip amháin. Níl aon bhealach ann a staid a shábháil agus ansin é a chur ar ais ón mbosca. Mar sin, cad atá le déanamh?

Bhí an réiteach ar an dromchla; bhí a chuid gnéithe go léir in úsáid againn cheana féin chun fadhbanna eile a réiteach:

  1. I gcás gach cliant, ní mór dúinn a fháil amach cén t-am a chonaic sé opponents nuair a bhrúigh sé na heochracha. Táimid tar éis an fhaisnéis seo a scríobh isteach sa phacáiste ionchuir cheana féin agus é a úsáid chun tuar na gcliant a choigeartú.
  2. Ní mór dúinn a bheith in ann stair na stáit cluiche a stóráil. Is ann a choinneoimid suíomhanna ár gcomhraic (agus dá bhrí sin a n-imbhuailteoirí). Bhí stair stáit againn cheana féin ar an bhfreastalaí, d'úsáideamar é chun tógáil deltas. Agus an t-am ceart ar eolas againn, d'fhéadfaimis an stát ceart a aimsiú go héasca sa stair.
  3. Anois go bhfuil staid an chluiche againn ón stair idir lámha, ní mór dúinn a bheith in ann sonraí na n-imreoirí a shioncronú le staid an domhain fhisiciúil. Imbhuailteoirí atá ann cheana féin - bogadh, cinn ar iarraidh - cruthaigh, cinn gan ghá - scrios. Scríobhadh an loighic seo cheana féin freisin agus chuimsigh sí roinnt córas ECS. D'úsáideamar é chun roinnt seomraí cluiche a shealbhú i bpróiseas Unity amháin. Agus toisc go bhfuil an domhan fisiceach ar cheann in aghaidh an phróisis, b'éigean é a athúsáid idir seomraí. Roimh gach tic den insamhalta, déanaimid "athshocrú" ar staid an domhain fhisiceach agus d'athdheisíomar é le sonraí don seomra reatha, ag iarraidh rudaí cluiche Unity a athúsáid oiread agus is féidir trí chóras cliste comhthiomsaithe. Ní raibh fágtha ach an loighic chéanna a agairt don stát cluiche ón am atá thart.

Trí na heilimintí seo go léir a chur le chéile, fuaireamar “meaisín ama” a d’fhéadfadh staid an domhain fhisiciúil a thabhairt ar ais go dtí an tráth ceart. Bhí an cód simplí:

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

Ní raibh fágtha ach a dhéanamh amach conas an meaisín seo a úsáid chun seatanna agus cumais a chúiteamh go héasca.

Sa chás is simplí, nuair a bhíonn an mheicnic bunaithe ar hitcan amháin, is cosúil go bhfuil gach rud soiléir: sula n-imríonn an t-imreoir, ní mór dó an domhan fisiceach a rolladh ar ais go dtí an staid atá ag teastáil, craoladh ray a dhéanamh, an hit nó an chailleann a chomhaireamh, agus an domhan ar ais go dtí an stát tosaigh.

Ach is fíorbheagán meicnic den sórt sin i Dino Squad! Cruthaíonn an chuid is mó de na hairm sa chluiche teilgeáin - urchair fhadtéarmacha a eitilt le haghaidh roinnt sceartáin insamhalta (i gcásanna áirithe, an iliomad sceartán). Cad atá le déanamh leo, cén t-am ar chóir dóibh eitilt?

В alt ársa Maidir leis an gcruach líonra Leath-Saoil, chuir na guys ó Valve an cheist chéanna, agus ba é an freagra a bhí orthu seo: tá fadhb le cúiteamh moille teilgeáin, agus is fearr é a sheachaint.

Ní raibh an rogha seo againn: bhí airm diúracáin mar phríomhghné de dhearadh an chluiche. Mar sin bhí orainn teacht suas le rud éigin. Tar éis beagán tobsmaointeoireachta, cheapamar dhá rogha a raibh an chuma orthu go n-oibreodh siad:

1. Ceanglaíonn muid an teilgeán le ham an imreora a chruthaigh é. Gach tic den insamhalta freastalaí, do gach piléar de gach imreoir, rollaimid an domhan fisiceach ar ais go dtí an stát cliaint agus déanaimid na ríomhanna riachtanacha. Leis an gcur chuige seo bhíothas in ann ualach dáilte a bheith ar an bhfreastalaí agus am eitilte teilgeáin intuartha. Bhí intuarthacht tábhachtach dúinn go háirithe, ós rud é go bhfuil gach teilgeáin againn, lena n-áirítear teilgeáin namhaid, tuartha ar an gcliant.

Mar a chuireamar feabhas ar mheicnic na n-áireamh ballistic do lámhachóir soghluaiste le algartam cúitimh latency líonra
Sa phictiúr, scaoileann an t-imreoir ag tic 30 diúracán in oirchill: feiceann sé cén treo ina bhfuil an namhaid ag rith agus tá a fhios aige faoi luas an diúracáin. Go háitiúil feiceann sé gur shroich sé an sprioc ag an 33ú tic. A bhuí le cúiteamh moille, beidh sé le feiceáil ar an bhfreastalaí freisin

2. Déanaimid gach rud mar an gcéanna leis an gcéad rogha, ach, tar éis tic amháin den insamhalta piléar a chomhaireamh, ní stopaimid, ach leanaimid ar aghaidh ag insamhail a eitilt laistigh den tic freastalaí céanna, ag tabhairt a chuid ama níos gaire don fhreastalaí gach uair. tic ceann ar cheann agus suímh imbhuailteora a nuashonrú. Déanaimid é seo go dtí go dtarlaíonn ceann de dhá rud:

  • Tá an piléar imithe in éag. Ciallaíonn sé seo go bhfuil na ríomhaireachtaí thart, is féidir linn a chomhaireamh chailleann nó hit. Agus tá sé seo ag an tic céanna inar fired an lámhaigh! Dúinn bhí sé seo idir móide agus lúide. A móide - mar gheall ar an imreoir lámhach laghdaigh sé seo go suntasach an mhoill idir an hit agus an laghdú ar shláinte an namhaid. Is é an downside gur breathnaíodh an éifeacht chéanna nuair a fired opponents ar an imreoir: an namhaid, is cosúil, fired ach roicéad mall, agus bhí an damáiste a chomhaireamh cheana féin.
  • Tá am an fhreastalaí sroichte ag an bpiléar. Sa chás seo, leanfaidh a insamhalta ar aghaidh sa chéad tic freastalaí eile gan aon cúiteamh aga. Maidir le teilgeáin mhall, d'fhéadfadh sé seo líon na n-aisrollaí fisice a laghdú go teoiriciúil i gcomparáid leis an gcéad rogha. Ag an am céanna, mhéadaigh an t-ualach míchothrom ar an insamhalta: bhí an freastalaí díomhaoin, nó i tic freastalaí amháin bhí sé ag ríomh dosaen sceartán insamhalta le haghaidh roinnt urchair.

Mar a chuireamar feabhas ar mheicnic na n-áireamh ballistic do lámhachóir soghluaiste le algartam cúitimh latency líonra
An cás céanna mar atá sa phictiúr roimhe seo, ach ríomh de réir an dara scéim. An diúracán “gafa suas” leis an am freastalaí ag an tic céanna a tharla an lámhaigh, agus is féidir an hit a chomhaireamh chomh luath leis an chéad tic eile. Ag an 31ú tic, sa chás seo, ní chuirtear cúiteamh moille i bhfeidhm a thuilleadh

Inár gcur chun feidhme, ní raibh difríocht idir an dá chur chuige seo ach cúpla líne de chód, mar sin chruthaigh muid an dá cheann, agus ar feadh i bhfad bhí siad ann go comhthreomhar. Ag brath ar mheicnic an airm agus luas an piléar, roghnaigh muid rogha amháin nó eile do gach dineasáir. Ba é an pointe ag casadh anseo an chuma i gcluiche na meicnice mar “má bhuaileann tú an namhaid an oiread sin uaireanta in am den sórt sin, faigh bónas den sórt sin.” Dhiúltaigh aon mheicneoir ina raibh ról tábhachtach ag an am a bhuail an t-imreoir leis an namhaid oibriú leis an dara cur chuige. Mar sin dar críoch muid suas ag dul leis an chéad rogha, agus baineann sé anois le gach arm agus gach cumas gníomhach sa chluiche.

Ar leithligh, is fiú ceist na feidhmíochta a ardú. Má cheap tú go gcuirfeadh sé seo go léir moill ar rudaí, freagraim: tá. Bíonn an t-aontas mall go leor ag bogadh imbhuailteoirí agus iad a chasadh air agus as. I Scuad Dino, sa chás "is measa", is féidir go mbeadh na céadta teilgeáin ann ag an am céanna sa chomhrac. Is só do-acmhainn é imbhuailteoirí a bhogadh chun gach diúracán a chomhaireamh ina n-aonar. Dá bhrí sin, bhí sé fíor-riachtanach dúinn líon na “rolladh siar” san fhisic a íoslaghdú. Chun seo a dhéanamh, chruthaíomar comhpháirt ar leith in ECS ina ndéanaimid taifead ar am an imreora. Chuireamar é leis na heintitis go léir a dteastaíonn cúiteamh moille uathu (teilgeáin, cumais, etc.). Sula dtosaímid ag próiseáil aonáin den sórt sin, déanaimid braisliú orthu faoin am seo agus próiseáilimid iad le chéile, ag rolladh siar an domhain fhisiceach uair amháin in aghaidh gach braisle.

Ag an gcéim seo tá córas oibre ginearálta againn. A cód i bhfoirm beagán simplithe:

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

Ní raibh fágtha ach na sonraí a chumrú:

1. A thuiscint cé mhéad chun an t-uasfhad gluaiseachta in am a theorannú.

Bhí sé tábhachtach dúinn an cluiche a dhéanamh chomh inrochtana agus is féidir i gcoinníollacha droch-líonraí soghluaiste, agus mar sin chuireamar teorainn leis an scéal le corrlach de 30 tic (le ráta tic de 20 Hz). Ligeann sé seo d'imreoirí a chéile comhraic a bhualadh fiú ag pings an-ard.

2. Aimsigh na rudaí is féidir a bhogadh in am agus nach féidir.

Táimid, ar ndóigh, ag bogadh ár opponents. Ach níl sciatha fuinnimh in-shuiteáilte, mar shampla. Shocraigh muid go raibh sé níos fearr tosaíocht a thabhairt don chumas cosanta, mar a dhéantar go minic i lámhachóirí ar líne. Má tá sciath curtha cheana féin ag an imreoir san am i láthair, níor cheart go n-eitiltíonn urchair ón am atá thart a bhfuil cúiteamh lag orthu tríd.

3. Déan cinneadh an bhfuil sé riachtanach cúiteamh a dhéanamh ar chumais na dineasáir: bite, stailc eireaball, etc. Shocraigh muid cad a bhí ag teastáil agus iad a phróiseáil de réir na rialacha céanna le piléar.

4. Déan amach cad atá le déanamh le himbhuailteoirí an imbhuailteora a bhfuil cúiteamh moille á dhéanamh ina leith. Ar bhealach maith, níor cheart go n-aistreofaí a seasamh san am atá caite: ba cheart don imreoir é féin a fheiceáil san am céanna ina bhfuil sé ar an bhfreastalaí anois. Mar sin féin, tugaimid ar ais imbhuailteoirí an imbhuailteora lámhach freisin, agus tá roinnt cúiseanna leis seo.

Ar an gcéad dul síos, feabhsaíonn sé braisliú: is féidir linn an staid fhisiceach céanna a úsáid do gach imreoir le dlúthphingne.

Ar an dara dul síos, i ngach craoltaí agus forluí a chuirimid as an áireamh i gcónaí imbhuailteoirí an imbhuailteora ar leis na cumais nó na teilgeáin. I Scuad Dino, rialaíonn imreoirí dineasáir, a bhfuil céimseata sách neamhchaighdeánach acu de réir caighdeáin lámhachóirí. Fiú má lámhachann an t-imreoir ar uillinn neamhghnách agus go dtéann trajectory an piléar trí imbhuailteoir dineasáir an imreora, déanfaidh an piléar neamhaird air.

Ar an tríú dul síos, ríomhaimid suímh arm an dineasáir nó pointe feidhme an chumais ag baint úsáide as sonraí ón ECS fiú roimh thús an chúitimh aga moille.

Mar thoradh air sin, níl tábhacht ag baint le fíorshuíomh imbhuailteoirí an imbhuailteora lagchúitimh dúinn, agus mar sin ghlacamar cosán níos táirgiúla agus ag an am céanna níos simplí.

Ní féidir latency líonra a bhaint go simplí, ní féidir ach é a chumhdach. Cosúil le haon mhodh eile faoi cheilt, tá comhbhabhtáil ag baint le cúiteamh moille freastalaí. Feabhsaíonn sé taithí cluichíochta an imreora atá ag lámhach ar chostas an imreora a bhfuiltear ag lámhach air. Maidir le Dino Squad, áfach, ba léir an rogha anseo.

Ar ndóigh, b'éigean íoc as seo go léir freisin le castacht mhéadaithe an chóid fhreastalaí ina iomláine - do ríomhchláraitheoirí agus dearthóirí cluiche araon. Más rud é go raibh an t-ionsamhlú ina ghlao simplí seicheamhach ar chórais, ansin le cúiteamh moille, bhí lúba neadaithe agus brainsí le feiceáil ann. Rinneamar go leor iarracht freisin chun é a dhéanamh áisiúil oibriú leis.

Sa leagan 2019 (agus b'fhéidir beagán níos luaithe), chuir Unity tacaíocht iomlán le haghaidh radhairc fhisiceacha neamhspleácha. Chuireamar i bhfeidhm iad ar an bhfreastalaí beagnach díreach tar éis an nuashonraithe, toisc go raibh muid ag iarraidh fáil réidh go tapa leis an domhan fisiceach a bhí coitianta i ngach seomra.

Thugamar a radharc fisiciúil féin do gach seomra cluiche agus mar sin chuireamar deireadh leis an ngá an radharc a “ghlanadh” ó shonraí an tseomra in aice láimhe roimh an insamhalta a ríomh. Ar an gcéad dul síos, thug sé méadú suntasach ar tháirgiúlacht. Ar an dara dul síos, bhíothas in ann fáil réidh le haicme iomlán fabhtanna a tháinig chun cinn má rinne an ríomhchláraitheoir earráid sa chód glanta radharc agus é ag cur eilimintí cluiche nua leis. Bhí sé deacair earráidí den sórt sin a dhífhabhtú, agus is minic a d'eascair staid na rudaí fisiceacha i radharc seomra amháin "ag sreabhadh" isteach i seomra eile.

Ina theannta sin, rinneamar roinnt taighde féachaint an bhféadfaí radhairc fhisiceacha a úsáid chun stair an domhain fhisiciúil a stóráil. Is é sin, go coinníollach, ní leithdháil radharc amháin ar gach seomra, ach 30 radharc, agus déan maolán timthriallach astu, chun an scéal a stóráil. Go ginearálta, d'éirigh leis an rogha a bheith ag obair, ach níor chuireamar i bhfeidhm é: níor léirigh sé aon mhéadú dÚsachtach ar tháirgiúlacht, ach bhí gá le hathruithe sách riosca. Bhí sé deacair a thuar cén chaoi a n-iompródh an freastalaí agus é ag obair ar feadh i bhfad leis an oiread sin radhairc. Mar sin, leanamar an riail: “Mura bhfuil sé briste, ná déan é a shocrú'.

Foinse: will.com

Add a comment