Yadda muka haɓaka injiniyoyi na lissafin ballistic don mai harbi ta hannu tare da algorithm ramuwa na latency na hanyar sadarwa

Yadda muka haɓaka injiniyoyi na lissafin ballistic don mai harbi ta hannu tare da algorithm ramuwa na latency na hanyar sadarwa

Barka dai, Ni Nikita Brizhak ne, mai haɓaka uwar garken daga Pixonic. A yau ina so in yi magana game da rama lag a multiplayer mobile.

An rubuta labarai da yawa game da ramuwar lagwar uwar garke, gami da Rashanci. Wannan ba abin mamaki bane, tun da an yi amfani da wannan fasaha sosai wajen ƙirƙirar FPS masu yawa tun daga ƙarshen 90s. Misali, zaku iya tunawa da yanayin QuakeWorld, wanda shine ɗayan na farko da yayi amfani da shi.

Hakanan muna amfani da shi a cikin Dino Squad mai harbi da yawa ta hannu.

A cikin wannan labarin, burina ba shine in maimaita abin da aka riga aka rubuta sau dubu ba, amma in faɗi yadda muka aiwatar da ramuwa a cikin wasanmu, la'akari da tarin fasahar mu da ainihin fasalin wasan kwaikwayo.

Kalmomi kaɗan game da cortex da fasaha.

Dino Squad shine mai harbi PvP ta wayar hannu. 'Yan wasa suna sarrafa dinosaur sanye take da makamai iri-iri kuma suna yaƙi da juna a cikin ƙungiyoyin 6v6.

Duk abokin ciniki da uwar garken sun dogara ne akan Unity. Gine-ginen ya kasance na al'ada ga masu harbi: uwar garken mai mulki ne, kuma tsinkayar abokin ciniki yana aiki akan abokan ciniki. An rubuta simintin wasan ta amfani da ECS na cikin gida kuma ana amfani dashi akan uwar garken da abokin ciniki.

Idan wannan shi ne karo na farko da kuka ji labarin rashin biyan diyya, ga ɗan gajeren balaguron balaguro cikin batun.

A wasannin FPS masu yawa, wasan yawanci ana kwaikwaya akan sabar mai nisa. Masu wasa suna aika bayanansu (bayani game da maɓallan da aka danna) zuwa uwar garken, kuma a cikin martani uwar garken ta aika musu da yanayin wasan da aka sabunta tare da la'akari da bayanan da aka karɓa. Tare da wannan makircin hulɗar, jinkiri tsakanin danna maɓallin gaba da lokacin da mai kunnawa ya motsa akan allon zai kasance mafi girma fiye da ping.

Yayin da a kan cibiyoyin sadarwa na gida wannan jinkirin (wanda ake kira lag shigarwa) na iya zama wanda ba a sani ba, lokacin wasa ta Intanet yana haifar da jin "zamewa akan kankara" lokacin sarrafa hali. Wannan matsalar tana da dacewa sau biyu ga cibiyoyin sadarwar wayar hannu, inda har yanzu ana ɗaukar lamarin lokacin da ping ɗin ɗan wasa ya kai 200 ms a matsayin haɗin gwiwa mai kyau. Yawancin lokaci ping na iya zama 350, 500, ko 1000 ms. Sa'an nan kuma ya zama kusan ba zai yiwu a kunna mai harbi mai sauri tare da lag ɗin shigarwa ba.

Maganin wannan matsala shine tsinkayar kwaikwaiyo-gefen abokin ciniki. Anan abokin ciniki da kansa yana amfani da shigarwar zuwa halin mai kunnawa, ba tare da jiran amsa daga uwar garken ba. Kuma lokacin da aka karɓi amsar, kawai yana kwatanta sakamakon kuma yana sabunta matsayin abokan hamayya. Jinkirta tsakanin latsa maɓalli da nuna sakamakon akan allo a wannan yanayin ba shi da yawa.

Yana da mahimmanci a fahimci nuance a nan: abokin ciniki koyaushe yana zana kansa bisa ga shigarwar ƙarshe, da abokan gaba - tare da jinkirin hanyar sadarwa, bisa ga jihar da ta gabata daga bayanan uwar garke. Wato, lokacin da ya harbi abokin gaba, dan wasan ya gan shi a baya dangane da kansa. Ƙari game da tsinkayar abokin ciniki mun rubuta a baya.

Don haka, tsinkayar abokin ciniki yana warware matsala ɗaya, amma ya haifar da wata: idan mai kunnawa ya harbe a wurin da abokan gaba suka kasance a baya, a kan uwar garke lokacin harbi a lokaci guda, abokan gaba na iya daina kasancewa a wurin. Ƙoƙarin biyan diyya na uwar garken don magance wannan matsala. Lokacin da aka harba makami, uwar garken ta dawo da yanayin wasan da dan wasan ya gani a gida a lokacin harbin, kuma ya duba ko da gaske zai iya kaiwa abokan gaba. Idan amsar ita ce "eh," ana ƙidaya bugun, koda kuwa abokan gaba ba su kasance a kan uwar garke ba a wannan lokacin.

Tare da wannan ilimin, mun fara aiwatar da ramuwa na lag na uwar garke a Dino Squad. Da farko, dole ne mu fahimci yadda za a mayar a kan uwar garke abin da abokin ciniki ya gani? Kuma menene ainihin bukatar a mayar? A cikin wasanmu, ana ƙididdige bugu daga makamai da iyawa ta hanyar raye-raye da overlays - wato, ta hanyar hulɗa da abokan gaba na zahiri. Saboda haka, muna buƙatar sake haifar da matsayi na waɗannan masu karo, wanda mai kunnawa "gani" a gida, akan uwar garke. A lokacin muna amfani da Unity version 2018.x. API ɗin kimiyyar lissafi akwai a tsaye, duniyar zahiri tana wanzuwa cikin kwafi ɗaya. Babu wata hanyar da za a ceci jihar sa sannan a mayar da ita daga akwatin. To me za ayi?

Maganin ya kasance a saman; duk abubuwan da muka riga muka yi amfani da su don magance wasu matsalolin:

  1. Ga kowane abokin ciniki, muna buƙatar sanin lokacin da ya ga abokan hamayya lokacin da ya danna maɓallan. Mun riga mun rubuta wannan bayanin a cikin kunshin shigarwa kuma mun yi amfani da shi don daidaita hasashen abokin ciniki.
  2. Muna buƙatar samun damar adana tarihin jihohin wasan. A cikinsa ne za mu rike mukaman abokan adawar mu (saboda haka abokan hamayyarsu). Mun riga mun sami tarihin jihar akan sabar, mun yi amfani da shi don ginawa deltas. Sanin lokacin da ya dace, za mu iya samun yanayin da ya dace a tarihi cikin sauƙi.
  3. Yanzu da muke da yanayin wasan daga tarihi a hannu, muna buƙatar samun damar daidaita bayanan ɗan wasa tare da yanayin duniyar zahiri. Matsalolin da suka wanzu - motsawa, ɓacewa - ƙirƙira, waɗanda ba dole ba - lalata. Wannan ma'ana kuma an riga an rubuta shi kuma ya ƙunshi tsarin ECS da yawa. Mun yi amfani da shi don riƙe dakunan wasa da yawa a cikin tsarin Unity ɗaya. Kuma tunda duniyar zahiri ɗaya ce akan kowane tsari, dole ne a sake amfani da ita tsakanin ɗakuna. Kafin kowane alamar simintin, muna "sake saita" yanayin duniyar zahiri kuma mu sake kunna shi tare da bayanai don ɗakin yanzu, muna ƙoƙarin sake amfani da abubuwan wasan Unity gwargwadon iko ta hanyar tsarin haɗawa da wayo. Abin da ya rage shi ne yin kira da dabaru iri ɗaya don yanayin wasan daga baya.

Ta hanyar haɗa duk waɗannan abubuwa tare, mun sami "na'urar lokaci" wanda zai iya mayar da yanayin duniyar zahiri zuwa lokacin da ya dace. Lambar ta zama mai sauƙi:

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

Abin da ya rage shi ne gano yadda za a yi amfani da wannan injin don sauƙi rama harbi da iyawa.

A cikin mafi sauƙi, lokacin da makanikai suka dogara ne akan hitscan guda ɗaya, duk abin da ya bayyana a sarari: kafin mai kunnawa ya harbe, yana buƙatar sake jujjuya duniyar zahiri zuwa yanayin da ake so, yin raycast, ƙididdige bugun ko rasa, kuma mayar da duniya zuwa farkon yanayin.

Amma irin waɗannan injiniyoyi kaɗan ne a Dino Squad! Yawancin makaman da ke cikin wasan suna haifar da tsinkaya - harsasai masu tsayi waɗanda ke tashi don tikitin kwaikwayo da yawa (a wasu lokuta, ticks da yawa). Me za a yi da su, yaushe za su tashi?

В tsohon labarin game da tari na cibiyar sadarwa na Half-Life, mutanen Valve sun yi tambaya iri ɗaya, kuma amsarsu ita ce: Matsalolin lag ɗin ramuwa yana da matsala, kuma yana da kyau a guji shi.

Ba mu da wannan zaɓi: makaman da ke da tushe sun kasance mahimmin fasalin ƙirar wasan. Don haka sai mun fito da wani abu. Bayan an yi nazari a hankali, mun tsara zaɓuka guda biyu waɗanda da alama suna aiki:

1. Mun ɗaure projectile zuwa lokacin ɗan wasan da ya ƙirƙira shi. Kowane alamar simintin uwar garken, ga kowane harsashi na kowane ɗan wasa, muna jujjuya duniyar zahiri zuwa yanayin abokin ciniki kuma muna yin lissafin da ya dace. Wannan hanya ta sa ya yiwu a sami nauyin rarraba akan uwar garke da lokacin tashi mai tsinkaya. Hasashen yana da mahimmanci musamman a gare mu, tunda muna da duk abubuwan da ake iya gani, gami da maƙiyi, annabta akan abokin ciniki.

Yadda muka haɓaka injiniyoyi na lissafin ballistic don mai harbi ta hannu tare da algorithm ramuwa na latency na hanyar sadarwa
A cikin hoton, mai kunnawa a tick 30 ya harba makami mai linzami a cikin jira: yana ganin inda abokan gaba ke gudana kuma ya san kimanin gudun makamin. A cikin gida yana ganin ya buge makasudin a karo na 33. Godiya ga lag ramuwa, zai kuma bayyana a kan uwar garke

2. Muna yin komai daidai da zaɓi na farko, amma, bayan ƙidaya kaska ɗaya na simintin harsashi, ba mu tsaya ba, amma muna ci gaba da yin simintin jirginsa a cikin kaska ɗaya na uwar garken, kowane lokaci yana kawo lokacinsa kusa da uwar garken. kaska ɗaya bayan ɗaya da sabunta wuraren karo. Muna yin haka har sai dayan abu biyu ya faru:

  • Harsashin ya kare. Wannan yana nufin cewa lissafin ya ƙare, za mu iya ƙidaya miss ko buga. Kuma wannan shi ne a daidai lokacin da aka harba harbin! A gare mu wannan duka ƙari ne da ragi. Ƙarin ƙari - saboda ga ɗan wasan harbi wannan ya rage jinkiri tsakanin bugun da raguwar lafiyar abokan gaba. Ƙarƙashin ƙasa shine cewa an lura da irin wannan tasiri lokacin da abokan adawa suka harba a kan mai kunnawa: abokan gaba, zai zama alama, kawai sun harba roka a hankali, kuma an riga an ƙidaya lalacewa.
  • Harsashin ya kai lokacin uwar garken. A wannan yanayin, simintin sa zai ci gaba a cikin alamar sabar uwar garken na gaba ba tare da wani ragi ba. Don jinkirin projectiles, wannan na iya rage yawan jujjuyawar kimiyyar lissafi idan aka kwatanta da zaɓi na farko. A lokaci guda, nauyin da bai dace ba a kan simulation ya karu: uwar garken ba ta da aiki, ko kuma a cikin alamar sabar guda ɗaya yana lissafin dozin simulation ticks don harsasai da yawa.

Yadda muka haɓaka injiniyoyi na lissafin ballistic don mai harbi ta hannu tare da algorithm ramuwa na latency na hanyar sadarwa
Irin wannan yanayin kamar yadda yake a cikin hoton da ya gabata, amma an ƙididdige shi bisa ga makirci na biyu. Makamin ya "kama" tare da lokacin uwar garke a daidai wannan kaska da harbi ya faru, kuma ana iya ƙidaya bugun tun da wuri na gaba. A kaska na 31, a wannan yanayin, ba a ƙara yin amfani da lag diyya

A cikin aiwatar da mu, waɗannan hanyoyi guda biyu sun bambanta a cikin layukan lamba biyu kawai, don haka mun ƙirƙiri duka biyun, kuma sun daɗe suna wanzuwa a layi daya. Dangane da injina na makamin da saurin harsashi, mun zaɓi ɗaya ko wani zaɓi don kowane dinosaur. Juyi a nan shine bayyanar a cikin wasan injiniyoyi kamar "idan kun bugi abokan gaba sau da yawa a cikin irin wannan kuma irin wannan lokaci, sami irin wannan kuma irin wannan kari." Duk wani makanikai inda lokacin da dan wasan ya bugi abokan gaba ya taka muhimmiyar rawa ya ki yin aiki tare da hanya ta biyu. Don haka mun ƙare tare da zaɓi na farko, kuma yanzu ya shafi duk makamai da duk damar iya aiki a wasan.

Na dabam, yana da daraja tada batun yin aiki. Idan kuna tunanin cewa duk wannan zai rage al'amura, na amsa: shi ne. Haɗin kai yana jinkirin motsi da kunnawa da kashe su. A cikin Dino Squad, a cikin yanayin "mafi muni", za a iya samun nau'o'i ɗari da yawa a lokaci guda a cikin fama. Matsar da maharan don ƙidaya kowane majigi daban-daban kayan alatu ne da ba za a iya araha ba. Saboda haka, ya zama wajibi a gare mu mu rage yawan adadin “rollbacks” na kimiyyar lissafi. Don yin wannan, mun ƙirƙiri wani sashi daban a cikin ECS wanda a ciki muke rikodin lokacin mai kunnawa. Mun ƙara shi ga duk ƙungiyoyin da ke buƙatar ramuwa mai lalacewa (ayyuka, iyawa, da sauransu). Kafin mu fara sarrafa irin waɗannan abubuwan, muna tattara su a wannan lokacin kuma mu sarrafa su tare, mu mayar da duniyar zahiri sau ɗaya ga kowane gungu.

A wannan mataki muna da tsarin aiki gabaɗaya. Lambar sa a cikin ɗan sauƙi mai sauƙi:

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

Duk abin da ya rage shine don saita cikakkun bayanai:

1. Fahimtar nawa don iyakance iyakar nisa na motsi a cikin lokaci.

Yana da mahimmanci a gare mu mu sanya wasan ya isa sosai a cikin yanayi mara kyau na cibiyoyin sadarwar hannu, don haka mun iyakance labarin tare da tazarar ticks 30 (tare da ƙimar kaska na 20 Hz). Wannan yana bawa 'yan wasa damar buga abokan adawar har ma a babban pings.

2. Ƙayyade abubuwan da za a iya motsa su cikin lokaci kuma waɗanda ba za su iya ba.

Mu, ba shakka, muna motsa abokan hamayyarmu. Amma garkuwar makamashi da za a iya girka, alal misali, ba. Mun yanke shawarar cewa ya fi kyau a ba da fifiko ga ikon karewa, kamar yadda aka saba yi a cikin masu harbi kan layi. Idan mai kunnawa ya riga ya sanya garkuwa a halin yanzu, harsasai masu lalacewa daga baya bai kamata su tashi ta ciki ba.

3. Yanke shawarar ko ya zama dole don ramawa ikon dinosaurs: cizo, yajin wutsiya, da sauransu. Mun yanke shawarar abin da ake buƙata kuma mu sarrafa su bisa ga ka'idodi iri ɗaya kamar harsasai.

4. Ƙayyade abin da za a yi da waɗanda suka yi karo da ɗan wasan da ake biyan diyya. A hanya mai kyau, matsayinsu bai kamata ya canza zuwa baya ba: mai kunnawa ya kamata ya ga kansa a daidai lokacin da yake yanzu a kan uwar garke. Duk da haka, muna kuma juya masu karo na dan wasan harbi, kuma akwai dalilai da yawa na wannan.

Na farko, yana inganta tari: za mu iya amfani da yanayin jiki iri ɗaya ga duk 'yan wasan da ke kusa da pings.

Na biyu, a cikin duk raycasts da overlaps a ko da yaushe mu ke ware masu karo na dan wasan da ya mallaki iyawa ko projectiles. A cikin Dino Squad, 'yan wasa suna sarrafa dinosaur, waɗanda ke da madaidaicin lissafi ta hanyar ma'aunin harbi. Ko da dan wasan ya yi harbi a wani kusurwa da ba a saba gani ba kuma yanayin harsashi ya ratsa ta cikin karon dinosaur na dan wasan, harsashin zai yi watsi da shi.

Na uku, muna ƙididdige matsayi na makamin dinosaur ko kuma wurin yin amfani da damar yin amfani da bayanai daga ECS tun kafin fara lag ramuwa.

A sakamakon haka, ainihin matsayi na masu yin karo na dan wasan da aka biya bashi ba shi da mahimmanci a gare mu, don haka mun ɗauki mafi amfani kuma a lokaci guda hanya mafi sauƙi.

Ba za a iya cire jinkirin hanyar sadarwa kawai ba, ana iya rufe shi kawai. Kamar kowace hanya ta ɓarna, ramuwar lag ɗin uwar garken yana da ɓangarorin sa. Yana inganta ƙwarewar wasan ɗan wasan da ke harbi a kashe ɗan wasan da aka harbe. Ga Dino Squad, duk da haka, zaɓi a nan ya fito fili.

Tabbas, duk waɗannan kuma dole ne a biya su ta hanyar haɓakar lambar uwar garken gaba ɗaya - duka ga masu shirye-shirye da masu zanen wasan. Idan a baya simulation ya kasance mai sauƙin kira na tsarin, to, tare da ramuwa mara kyau, madaukai na gida da rassan sun bayyana a ciki. Mun kuma yi ƙoƙari mai yawa don sanya shi dacewa don yin aiki da shi.

A cikin sigar 2019 (kuma wataƙila ɗan baya), Unity ta ƙara cikakken goyan baya ga fage na zahiri. Mun aiwatar da su akan uwar garken kusan nan da nan bayan sabuntawa, saboda muna so mu hanzarta kawar da duniyar zahiri ta gama gari ga duk ɗakuna.

Mun ba kowane ɗakin wasan wasan kwaikwayo na jiki kuma don haka ya kawar da buƙatar "share" wurin daga bayanan ɗakin maƙwabta kafin yin lissafin simulation. Da fari dai, ya ba da gagarumin haɓakar yawan aiki. Abu na biyu, ya ba da damar kawar da duka nau'ikan kwari waɗanda suka taso idan mai tsara shirye-shiryen ya yi kuskure a cikin lambar tsaftace wurin lokacin ƙara sabbin abubuwan wasa. Irin waɗannan kurakuran sun kasance masu wuyar cirewa, kuma galibi suna haifar da yanayin abubuwa na zahiri a cikin daki ɗaya "suna kwarara" zuwa wani ɗaki.

Bugu da ƙari, mun yi wasu bincike kan ko za a iya amfani da fage na zahiri don adana tarihin duniyar zahiri. Wato, a cikin sharadi, ba da wuri ɗaya ba ga kowane ɗaki, amma fage guda 30, kuma a yi maƙallan kewayawa daga cikinsu, inda za a adana labarin. Gabaɗaya, zaɓin ya juya yana aiki, amma ba mu aiwatar da shi ba: bai nuna wani haɓakar hauka na yawan aiki ba, amma yana buƙatar canje-canje masu haɗari. Yana da wuya a hango yadda uwar garken zai kasance yayin aiki na dogon lokaci tare da al'amuran da yawa. Saboda haka, mun bi ka'idar: "Idan ba a karya ba, kada ka gyara shi".

source: www.habr.com

Add a comment