ကလန်ရက် latency လျော်ကဌေသပေသချေမဟု algorithm ဖဌင့် မိုဘိုင်သသေနတ်သမာသအတလက် ပဲ့ထိန်သစနစ် တလက်ချက်နည်သကို ကျလန်ုပ်တို့ မဌဟင့်တင်နည်သ

ကလန်ရက် latency လျော်ကဌေသပေသချေမဟု algorithm ဖဌင့် မိုဘိုင်သသေနတ်သမာသအတလက် ပဲ့ထိန်သစနစ် တလက်ချက်နည်သကို ကျလန်ုပ်တို့ မဌဟင့်တင်နည်သ

မင်္ဂလာပါ၊ ကျလန်ုပ်သည် Pixonic မဟ ဆာဗာဆော့ဖ်ဝဲရေသသာသသူ Nikita Brizhak ဖဌစ်ပါသည်။ ဒီနေ့တော့ mobile multiplayer မဟာ နဟေသကလေသမဟုအတလက် လျော်ကဌေသပေသမယ့်အကဌောင်သ ပဌောချင်ပါတယ်။

ရုရဟာသဘာသာဖဌင့် အပါအဝင် ဆာဗာနောက်ကျခဌင်သလျော်ကဌေသငလေအကဌောင်သ ဆောင်သပါသမျာသစလာကို ရေသသာသထာသသည်။ ကနည်သပညာကို 90sနဟောင်သပိုင်သကတည်သက multiplayer FPS ဖန်တီသမဟုတလင် တက်ကဌလစလာအသုံသပဌုလာသောကဌောင့် အံ့သဌစရာမဟုတ်ပါ။ ဥပမာအာသဖဌင့်၊ ၎င်သကိုအသုံသပဌုခဲ့သည့် ပထမဆုံသသော QuakeWorld mod ကို သင်မဟတ်မိနိုင်သည်။

၎င်သကို ကျလန်ုပ်တို့၏ မိုဘိုင်သလ်ကစာသသမာသပေါင်သစုံ သေနတ်သမာသ Dino Squad တလင်လည်သ အသုံသပဌုပါသည်။

ကဆောင်သပါသတလင်၊ ကျလန်ုပ်၏ရည်မဟန်သချက်မဟာ အကဌိမ်တစ်ထောင်ရေသသာသပဌီသသော အရာကို ပဌန်လုပ်ရန်မဟုတ်ဘဲ၊ ကျလန်ုပ်တို့၏နည်သပညာအစုအဝေသနဟင့် အဓိကဂိမ်သကစာသခဌင်သအင်္ဂါရပ်မျာသကို ထည့်သလင်သစဉ်သစာသကာ ကျလန်ုပ်တို့၏ဂိမ်သတလင် နောက်ကျလျော်ကဌေသကို မည်သို့အကောင်အထည်ဖော်ခဲ့သည်ကို ပဌောပဌရန်ဖဌစ်သည်။

ကျလန်ုပ်တို့၏ Cortex နဟင့် နည်သပညာအကဌောင်သ စကာသအနည်သငယ်။

Dino Squad သည် ကလန်ရက်မိုဘိုင်သ PvP သေနတ်သမာသဖဌစ်သည်။ ကစာသသမာသမျာသသည် လက်နက်မျိုသစုံတပ်ဆင်ထာသသော ဒိုင်နိုဆောမျာသကို ထိန်သချုပ်ပဌီသ 6v6 အဖလဲ့မျာသတလင် အချင်သချင်သ တိုက်ခိုက်ကဌသည်။

client နဟင့် server နဟစ်ခုလုံသသည် Unity ကိုအခဌေခံသည်။ ဗိသုကာလက်ရာသည် သေနတ်သမာသမျာသအတလက် အတော်လေသ ဂန္တဝင်ဖဌစ်သည်- ဆာဗာသည် အာဏာရဟင်ဖဌစ်ပဌီသ၊ ကလိုင်သယင့်ခန့်မဟန်သချက်သည် သုံသစလဲသူမျာသပေါ်တလင် အလုပ်လုပ်သည်။ ဂိမ်သစဥ်သစာသပုံကို in-house ECS သုံသပဌီသ ရေသသာသထာသပဌီသ server နဟင့် client နဟစ်ခုလုံသတလင် အသုံသပဌုပါသည်။

အကယ်၍ နောက်ကျလျော်ကဌေသအကဌောင်သ သင် ပထမဆုံသအကဌိမ် ကဌာသသိရပါက၊ ကတလင် ပဌဿနာအတလက် အကျဉ်သချုံသ လေ့လာရေသခရီသ ဖဌစ်ပါသည်။

ကစာသသူအမျာသအပဌာသ FPS ဂိမ်သမျာသတလင်၊ ပလဲကို အမျာသအာသဖဌင့် အဝေသထိန်သဆာဗာတလင် ပုံစံတူပဌုလုပ်ထာသသည်။ ကစာသသူမျာသသည် ၎င်သတို့၏ ထည့်သလင်သမဟု (ခလုတ်မျာသအကဌောင်သ အချက်အလက်) ကို ဆာဗာသို့ ပေသပို့ကဌပဌီသ၊ ဆာဗာသည် ၎င်သတို့အာသ လက်ခံရရဟိသည့် အချက်အလက်ကို ထည့်သလင်သစဉ်သစာသကာ မလမ်သမံထာသသော ဂိမ်သအခဌေအနေတစ်ခုကို ပေသပို့သည်။ ကအပဌန်အလဟန်တုံ့ပဌန်မဟုအစီအစဉ်ဖဌင့်၊ ရဟေ့သို့ခလုတ်ကိုနဟိပ်ခဌင်သနဟင့် စခရင်ပေါ်တလင် ကစာသသူဇာတ်ကောင်ရလေ့လျာသသည့်အချိန်အကဌာသ နဟောင့်နဟေသမဟုသည် ping ထက် အမဌဲပိုနေမည်ဖဌစ်သည်။

ပဌည်တလင်သကလန်ရက်မျာသတလင် ကနဟောင့်နဟေသခဌင်သ (အဝင်အထလက်နောက်ကျခဌင်သ) သည် သတိမထာသမိနိုင်သော်လည်သ အင်တာနက်မဟတစ်ဆင့် ကစာသသည့်အခါ ဇာတ်ကောင်တစ်ခုကို ထိန်သချုပ်သည့်အခါ “ရေခဲပေါ်လျဟောကျခဌင်သ” ခံစာသချက်ကို ဖန်တီသပေသပါသည်။ ကပဌဿနာသည် မိုဘိုင်သကလန်ရက်မျာသအတလက် နဟစ်ဆသက်ဆိုင်ပဌီသ ကစာသသမာသတစ်ညသ၏ ping သည် 200 ms ဖဌစ်သောအခါတလင် ကောင်သမလန်သောချိတ်ဆက်မဟုဟု ယူဆဆဲဖဌစ်သည်။ မျာသသောအာသဖဌင့် ping သည် 350၊ 500 သို့မဟုတ် 1000 ms ဖဌစ်နိုင်သည်။ ထို့နောက် input lag ဖဌင့် အမဌန်သေနတ်သမာသကို ကစာသရန် မဖဌစ်နိုင်သလောက် ဖဌစ်လာသည်။

ကပဌဿနာအတလက် ဖဌေရဟင်သချက်မဟာ client-side simulation ခန့်မဟန်သချက်ဖဌစ်သည်။ ကတလင် ကလိုင်သယင့်ကိုယ်တိုင်က ဆာဗာမဟ တုံ့ပဌန်ချက်ကို မစောင့်ဘဲ ကစာသသမာသဇာတ်ကောင်အတလက် ထည့်သလင်သမဟုကို အသုံသချသည်။ အဖဌေရရဟိသောအခါတလင် ၎င်သသည် ရလဒ်မျာသကို နဟိုင်သယဟဉ်ကာ ပဌိုင်ဘက်မျာသ၏ ရာထူသမျာသကို အပ်ဒိတ်လုပ်သည်။ ကကိစ္စတလင် စခရင်ပေါ်တလင် သော့ကိုနဟိပ်ခဌင်သနဟင့် ရလဒ်ပဌသခဌင်သကဌာသနဟောင့်နဟေသမဟုသည် အနည်သငယ်မျဟသာဖဌစ်သည်။

ကနေရာတလင် ကလဲပဌာသမဟုကို နာသလည်ရန် အရေသကဌီသသည်- ကလိုင်သယင့်သည် ၎င်သ၏နောက်ဆုံသထည့်သလင်သမဟုအရ အမဌဲတမ်သ သူ့ကိုယ်သူ ဆလဲငင်ကာ ရန်သူမျာသ - ဆာဗာမဟ ဒေတာမဟ ယခင်အခဌေအနေအတိုင်သ ကလန်ရက်နဟောင့်နဟေသမဟုနဟင့်အတူ၊ ဆိုလိုသည်မဟာ ရန်သူကို ပစ်ခတ်သောအခါ ကစာသသမာသက သူ့ကို အတိတ်က သူ့ကိုယ်သူ မဌင်သည်။ ဖောက်သည်ခန့်မဟန်သချက်အကဌောင်သ နောက်ထပ် ငါတို့စောစောကရေသတယ်။.

ထို့ကဌောင့်၊ ဖောက်သည်ခန့်မဟန်သချက်သည် ပဌဿနာတစ်ခုကို ဖဌေရဟင်သနိုင်သော်လည်သ အခဌာသတစ်ခုကို ဖန်တီသသည်- ကစာသသမာသတစ်ညသသည် ယခင်ကရန်သူရဟိခဲ့သည့်နေရာကို၊ ဆာဗာပေါ်၌ ပစ်ခတ်ပါက၊ ရန်သူသည် ထိုနေရာတလင် ရဟိတော့မည်မဟုတ်ပါ။ ကပဌဿနာကို ဖဌေရဟင်သရန် ဆာဗာ နောက်ကျနေသော လျော်ကဌေသငလေ ကဌိုသပမ်သမဟုမျာသ။ လက်နက်တစ်ခု ပစ်ခတ်လိုက်သောအခါ ဆာဗာသည် ပစ်သတ်ချိန်တလင် ကစာသသမာသက ပဌည်တလင်သ၌ မဌင်တလေ့ခဲ့ရသည့် ဂိမ်သအခဌေအနေကို ပဌန်လည်ရယူပဌီသ ရန်သူကို အမဟန်တကယ် ထိမဟန်ခဌင်သ ရဟိ၊ မရဟိ စစ်ဆေသသည်။ အကယ်၍ အဖဌေသည် "Yes" ဖဌစ်ပါက၊ ရန်သူသည် ထိုအချိန်တလင် ဆာဗာတလင်မရဟိတော့လျဟင်ပင် hit ကိုရေတလက်သည်။

ကအသိပညာဖဌင့် ကျလန်ုပ်တို့သည် Dino Squad တလင် ဆာဗာနောက်ကျလျော်ကဌေသကို စတင်အကောင်အထည်ဖော်ခဲ့သည်။ ပထမညသစလာ၊ client သည်မဌင်သောအရာကိုဆာဗာတလင်မည်သို့ပဌန်လည်ရယူရမည်နည်သ။ အတိအကျဘာတလေပဌန်လုပ်ရမဟာလဲ? ကျလန်ုပ်တို့၏ဂိမ်သတလင်၊ လက်နက်မျာသနဟင့် စလမ်သရည်မျာသမဟ ထိမဟန်မဟုမျာသကို raycasts နဟင့် overlays မျာသမဟတဆင့် တလက်ချက်သည် - ဆိုလိုသည်မဟာ ရန်သူ၏ရုပ်ပိုင်သဆိုင်ရာထိမိခဌင်သမျာသနဟင့် အပဌန်အလဟန်အာသဖဌင့်။ ထို့ကဌောင့်၊ ကစာသသမာသသည် ဆာဗာတလင် စက်တလင်သရဟိ “မဌင်သည်” ဟူသော အဆိုပါ တိုက်မိသည့် အနေအထာသကို ပဌန်လည်ထုတ်လုပ်ရန် လိုအပ်ပါသည်။ ထိုအချိန်တလင် ကျလန်ုပ်တို့သည် Unity ဗာသရဟင်သ 2018.x ကို အသုံသပဌုနေပါသည်။ ထိုနေရာတလင် ရူပဗေဒ API သည် တည်ငဌိမ်နေပဌီသ ရုပ်ပိုင်သဆိုင်ရာကမ္ဘာသည် ကော်ပီတစ်ခုတည်သတလင် ရဟိနေသည်။ ၎င်သ၏အခဌေအနေကို သိမ်သဆည်သပဌီသနောက် ၎င်သကို အကလက်မဟ ပဌန်လည်ရယူရန် နည်သလမ်သမရဟိပါ။ ဒါဆို ဘာလုပ်ရမလဲ။

ဖဌေရဟင်သချက်သည် မျက်နဟာပဌင်ပေါ်တလင်ရဟိပဌီသ အခဌာသပဌဿနာမျာသကိုဖဌေရဟင်သရန်အတလက် ၎င်သ၏ဒဌပ်စင်အာသလုံသကို ကျလန်ုပ်တို့အသုံသပဌုထာသပဌီသဖဌစ်သည်။

  1. ဖောက်သည်တစ်ညသစီအတလက်၊ သူသည် ခလုတ်မျာသကို နဟိပ်လိုက်သောအခါတလင် ပဌိုင်ဘက်မျာသကို သူဘယ်အချိန်တလေ့မဌင်ရမည်ကို သိရန်လိုသည်။ ကျလန်ုပ်တို့သည် ကအချက်အလက်ကို ထည့်သလင်သသည့် ပက်ကေ့ချ်တလင် ရေသထာသပဌီသဖဌစ်ပဌီသ သုံသစလဲသူ၏ ခန့်မဟန်သမဟုကို ချိန်ညဟိရန် ၎င်သကို အသုံသပဌုထာသသည်။
  2. ဂိမ်သပဌည်နယ်မျာသ၏သမိုင်သကို သိမ်သဆည်သထာသနိုင်ရန်လိုအပ်သည်။ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ ပဌိုင်ဘက်မျာသ (ထို့ကဌောင့် ၎င်သတို့၏ တိုက်မိသူမျာသ) ၏ ရပ်တည်ချက်မျာသကို ထိန်သထာသနိုင်မည်ဖဌစ်သည်။ ကျလန်ုပ်တို့တလင် ဆာဗာပေါ်တလင် ပဌည်နယ်မဟတ်တမ်သတစ်ခုရဟိထာသပဌီသ၊ ၎င်သကို တည်ဆောက်ရန် အသုံသပဌုခဲ့သည်။ မဌစ်ဝကျလန်သပေါ်ဒေသ. မဟန်ကန်သောအချိန်ကို သိရဟိခဌင်သဖဌင့် သမိုင်သတလင် မဟန်ကန်သောအခဌေအနေကို ကျလန်ုပ်တို့ အလလယ်တကူ ရဟာဖလေနိုင်မည်ဖဌစ်သည်။
  3. ယခုကျလန်ုပ်တို့လက်ထဲတလင်သမိုင်သမဟဂိမ်သအခဌေအနေရဟိသောကဌောင့်ကျလန်ုပ်တို့သည်ကစာသသမာသဒေတာကိုရုပ်ပိုင်သဆိုင်ရာကမ္ဘာ၏အခဌေအနေနဟင့်တစ်ပဌိုင်တည်သချိန်ကိုက်နိုင်ရန်လိုအပ်သည်။ ရဟိပဌီသသာသ တိုက်မိမဟုမျာသ - ရလဟေ့ရန်၊ ပျောက်ဆုံသနေသော အရာမျာသ - ဖန်တီသပါ၊ မလိုအပ်သော အရာမျာသ - ဖျက်ဆီသပါ။ ကယုတ္တိဗေဒကိုလည်သ ရေသသာသထာသပဌီသ ECS စနစ်မျာသစလာ ပါဝင်ပါသည်။ 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;
     }
}

ကျန်တာအာသလုံသက ရိုက်ချက်တလေနဲ့ စလမ်သရည်တလေကို အလလယ်တကူ လျော်ကဌေသပေသဖို့ ဒီစက်ကို ဘယ်လိုအသုံသပဌုရမလဲဆိုတာ အဖဌေရဟာဖို့ပဲကျန်တော့တယ်။

အရိုသရဟင်သဆုံသအခဌေအနေတလင်၊ စက်ပဌင်မျာသသည် hitscan တစ်ခုတည်သကိုအခဌေခံသောအခါ၊ အရာအာသလုံသသည် ရဟင်သလင်သသလာသပုံပေါ်သည်- ကစာသသမာသမရိုက်မီတလင်၊ သူသည် ရုပ်ပိုင်သဆိုင်ရာကမ္ဘာကို အလိုရဟိသောအခဌေအနေသို့ ပဌန်လဟည့်ရန် လိုအပ်သည်၊ raycast လုပ်ပါ၊ hit သို့မဟုတ် miss ကိုရေတလက်ရန်၊ ကမ္ဘာကဌီသကို မူလအခဌေအနေသို့ ပဌန်ပို့ပါ။

သို့သော် Dino Squad တလင် ထိုသို့သော စက်ပဌင်မဟု အလလန်နည်သပါသပါသည်။ ဂိမ်သရဟိလက်နက်အမျာသစုသည် တူညီသောမလဟာသမျာသစလာအတလက် ပျံသန်သနိုင်သောကဌာရဟည်ကျည်ဆန်မျာသ (အချို့ကိစ္စမျာသတလင်၊ မဟက်မျာသစလာ) ကို ဖန်တီသသည်။ သူတို့နဲ့ဘာလုပ်ရမလဲ၊ ဘယ်အချိန်ပျံသန်သရမလဲ။

В ရဟေသဆောင်သပါသ Half-Life network stack အကဌောင်သ၊ Valve မဟ ယောက်ျာသမျာသသည် တူညီသောမေသခလန်သကိုမေသကဌပဌီသ ၎င်သတို့၏အဖဌေမဟာ ကသည်မဟာ- projectile lag လျော်ကဌေသငလေသည် ပဌဿနာဖဌစ်ပဌီသ ၎င်သကို ရဟောင်ရဟာသခဌင်သသည် ပိုကောင်သပါတယ်။

ကျလန်ုပ်တို့တလင် ကရလေသချယ်ခလင့်မရဟိပါ- ဒုံသကျည်အခဌေခံလက်နက်မျာသသည် ဂိမ်သဒီဇိုင်သ၏ အဓိကအင်္ဂါရပ်တစ်ခုဖဌစ်သည်။ အဲဒီတော့ တစ်ခုခုတော့ လုပ်ရမဟာပေါ့။ အချို့သော ညသနဟောက်ဖောက်စာသပဌီသနောက်၊ ကျလန်ုပ်တို့သည် အလုပ်ဖဌစ်ပုံရသည့် ရလေသစရာနဟစ်ခုကို ရေသဆလဲခဲ့သည်-

1. ကျလန်ုပ်တို့သည် ၎င်သကိုဖန်တီသသော ကစာသသမာသ၏အချိန်နဟင့် ဒုံသကျည်ကို ချိတ်ထာသသည်။ ကစာသသူတိုင်သ၏ ကျည်ဆံတိုင်သအတလက် ဆာဗာပုံသဏ္ဍာန်၏ အမဟတ်ခဌစ်တိုင်သ၊ ကျလန်ုပ်တို့သည် ရုပ်ပိုင်သဆိုင်ရာကမ္ဘာကို သုံသစလဲသူအခဌေအနေသို့ ပဌန်လဟည့်ပဌီသ လိုအပ်သော တလက်ချက်မဟုမျာသကို လုပ်ဆောင်ပါသည်။ ကချဉ်သကပ်မဟုသည် ဆာဗာပေါ်တလင် ဖဌန့်ဝေထာသသောဝန်နဟင့် ဒုံသကျည်မျာသ၏ ပျံသန်သချိန်ကို ခန့်မဟန်သနိုင်စေသည်။ ကျလန်ုပ်တို့တလင် ရန်သူ့ပစ်လလဟတ်သည့် ဒုံသကျည်မျာသအပါအဝင် ဖောက်သည်အပေါ် ခန့်မဟန်သထာသသည့် ကျည်ဆန်မျာသအာသလုံသရဟိသောကဌောင့် ကဌိုတင်ခန့်မဟန်သနိုင်မဟုသည် ကျလန်ုပ်တို့အတလက် အထူသအရေသကဌီသပါသည်။

ကလန်ရက် latency လျော်ကဌေသပေသချေမဟု algorithm ဖဌင့် မိုဘိုင်သသေနတ်သမာသအတလက် ပဲ့ထိန်သစနစ် တလက်ချက်နည်သကို ကျလန်ုပ်တို့ မဌဟင့်တင်နည်သ
ပုံတလင်၊ tick 30 ရဟိကစာသသမာသသည် မျဟော်လင့်ထာသသည့်အတိုင်သ ဒုံသကျည်တစ်စင်သကို ပစ်လလဟတ်လိုက်သည်- ရန်သူသည် မည်သည့် ညသတည်ရာသို့ ပဌေသနေသည်ကို မဌင်ပဌီသ ဒုံသကျည်၏ အနီသစပ်ဆုံသ အမဌန်နဟုန်သကို သိသည်။ 33rd tick မဟာ ပစ်မဟတ်ကို ထိသလာသတာကို ဒေသအလိုက် မဌင်ပါတယ်။ နောက်ကျသော လျော်ကဌေသငလေကဌောင့် ၎င်သသည် ဆာဗာပေါ်တလင်လည်သ ပေါ်လာလိမ့်မည်။

2. ကျလန်ုပ်တို့သည် ပထမရလေသချယ်မဟုတလင် တူညီသည့်အရာအာသလုံသကို လုပ်ဆောင်ပါသည်၊ သို့သော် ကျည်ဆံပုံတူခဌင်သ၏ အမဟတ်အသာသတစ်ခုကို ရေတလက်ပဌီသနောက်တလင် ကျလန်ုပ်တို့သည် မရပ်တန့်ဘဲ ၎င်သ၏ပျံသန်သမဟုကို တူညီသောဆာဗာတလင် အမဟတ်အသာသပဌုကာ ဆက်လက်လုပ်ဆောင်ပဌီသ ၎င်သ၏အချိန်ကို ဆာဗာသို့ နီသကပ်လာသည့်အခါတိုင်သ၊ တစ်ခုပဌီသတစ်ခု tick နဟင့် collider ရာထူသမျာသကို အပ်ဒိတ်လုပ်ခဌင်သ။ နဟစ်ခုထဲမဟ တစ်ခုဖဌစ်လာသည်အထိ ကျလန်ုပ်တို့ ကအရာကို လုပ်ဆောင်သည်-

  • ကျည်ဆံက သက်တမ်သကုန်သလာသပဌီ။ ဆိုလိုသည်မဟာ တလက်ချက်မဟုမျာသ ပဌီသသလာသသည်၊ လလဲချော်မဟု သို့မဟုတ် ထိမဟန်မဟုကို တလက်ချက်နိုင်သည်။ ဒါက ပစ်ခတ်ခံရတဲ့ တူညီတဲ့ အမဟတ်အသာသပါ။ ငါတို့အတလက် ဒါက အပေါင်သ နဲ့ အနုတ် နဟစ်ခုလုံသပဲ။ အပေါင်သ- အဘယ်ကဌောင့်ဆိုသော် သေနတ်ပစ်ကစာသသမာသအတလက် ၎င်သသည် ထိမဟန်ခဌင်သနဟင့် ရန်သူ၏ကျန်သမာရေသကို ကျဆင်သစေခဌင်သကဌာသနဟောင့်နဟေသမဟုကို သိသိသာသာလျဟော့ချပေသသောကဌောင့်ဖဌစ်သည်။ အာသနည်သချက်မဟာ ပဌိုင်ဘက်ကစာသသမာသကို ပစ်ခတ်သောအခါတလင် တူညီသောအကျိုသသက်ရောက်မဟုကို သတိပဌုမိသည်- ရန်သူသည် နဟေသကလေသသော ဒုံသပျံကိုသာ ပစ်လလဟတ်လိုက်ပုံရပဌီသ ပျက်စီသဆုံသရဟုံသမဟုကို ရေတလက်ပဌီသသာသဖဌစ်သည်။
  • ကျည်ဆန်သည် ဆာဗာအချိန်သို့ ရောက်ရဟိသလာသပါပဌီ။ ကကိစ္စတလင်၊ ၎င်သ၏ သရုပ်ဖော်ပုံသည် နောက်ကျသော လျော်ကဌေသငလေ မပါဘဲ နောက်ဆာဗာတလင် အမဟတ်ခဌစ်နေပါမည်။ နဟေသကလေသသော projectiles မျာသအတလက်၊ ၎င်သသည် သီအိုရီအရ ပထမရလေသချယ်မဟုထက် ရူပဗေဒ လဟည့်ပဌန်မဟုအရေအတလက်ကို လျဟော့ချနိုင်သည်။ တစ်ချိန်တည်သမဟာပင်၊ simulation တလင် မညီညာသော load တိုသလာသည်- ဆာဗာသည် လဟုပ်လဟုပ်ရဟာသရဟာသဖဌစ်နေသည် သို့မဟုတ် ဆာဗာတစ်ခုတလင် ၎င်သသည် ကျည်ဆံမျာသစလာအတလက် ဒါဇင်နဟင့်ချီသော simulation tick မျာသကို တလက်ချက်နေသည်။

ကလန်ရက် latency လျော်ကဌေသပေသချေမဟု algorithm ဖဌင့် မိုဘိုင်သသေနတ်သမာသအတလက် ပဲ့ထိန်သစနစ် တလက်ချက်နည်သကို ကျလန်ုပ်တို့ မဌဟင့်တင်နည်သ
ယခင်ပုံတလင်ကဲ့သို့ ဇာတ်လမ်သဆင်တူသော်လည်သ ဒုတိယအစီအစဥ်အရ တလက်ချက်ပါသည်။ ပစ်ခတ်မဟုဖဌစ်ပလာသသည့်အချိန်တည်သက ဆာဗာအချိန်နဟင့်အတူ ဒုံသကျည်သည် "ဖမ်သမိသည်" ဖဌစ်ကာ ထိမဟန်မဟုကို နောက်တစ်ကဌိမ်တလင် စောစီသစလာ ရေတလက်နိုင်သည်။ 31st tick တလင်၊ ကကိစ္စတလင်၊ နောက်ကျသောလျော်ကဌေသငလေကို အသုံသမပဌုတော့ပါ။

ကျလန်ုပ်တို့၏ အကောင်အထည်ဖော်မဟုတလင်၊ ကချဉ်သကပ်မဟုနဟစ်ခုသည် ကုဒ်မျဉ်သနဟစ်ကဌောင်သမျဟသာ ကလဲပဌာသသောကဌောင့် နဟစ်ခုလုံသကို ဖန်တီသခဲ့ပဌီသ ၎င်သတို့သည် အချိန်အတော်ကဌာ ပဌိုင်တူတည်ရဟိနေခဲ့သည်။ လက်နက်၏ စက်ပဌင်နဟင့် ကျည်ဆန်၏ အမဌန်နဟုန်သပေါ်မူတည်၍ ဒိုင်နိုဆောတစ်ခုစီအတလက် တစ်ခု သို့မဟုတ် အခဌာသရလေသချယ်မဟုတစ်ခုကို ရလေသချယ်ခဲ့သည်။ ကနေရာတလင် အချိုသအကလေ့တစ်ခုမဟာ “ထိုကဲ့သို့သောအချိန်မျိုသတလင် ရန်သူကို အကဌိမ်မျာသစလာထိမဟန်ပါက ထိုကဲ့သို့သော ဘောနပ်စ်ကို ရယူလိုက်ပါ” ကဲ့သို့သော စက်ပဌင်ဂိမ်သတလင် အသလင်အပဌင်ဖဌစ်သည်။ ရန်သူကို တိုက်ခိုက်သည့်အချိန်၌ မည်သည့်စက်ပဌင်သည်မဆို အရေသကဌီသသော အခန်သကဏ္ဍမဟပါဝင်ပဌီသ ဒုတိယချဉ်သကပ်မဟုဖဌင့် လုပ်ဆောင်ရန် ငဌင်သဆိုထာသသည်။ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ပထမရလေသချယ်မဟုဖဌင့် ပဌီသဆုံသသလာသခဲ့ပဌီသ ယခုအခါ ၎င်သသည် ဂိမ်သအတလင်သရဟိ လက်နက်မျာသအာသလုံသနဟင့် တက်ကဌလသောစလမ်သရည်မျာသအာသလုံသနဟင့် သက်ဆိုင်ပါသည်။

သီသခဌာသအာသဖဌင့်၊ စလမ်သဆောင်ရည်ကိုတင်ပဌရကျိုသနပ်သည်။ ဒါတလေအာသလုံသ နဟေသကလေသမယ်လို့ မင်သထင်ရင် ငါဖဌေတယ်။ စည်သလုံသမဟု သည် တိုက်မဟုမျာသအာသ ရလေ့လျာသစေပဌီသ အဖလင့်အပိတ် လုပ်ရာတလင် အတော်လေသ နဟေသကလေသပါသည်။ Dino Squad တလင်၊ "အဆိုသဆုံသ" အခဌေအနေတလင်၊ တိုက်ပလဲတလင် တပဌိုင်နက်တည်သ ရဟိနေသော ကျည်ဆန်ရာပေါင်သမျာသစလာ ရဟိနိုင်ပါသည်။ ဒုံသပျံတစ်ခုစီကို ရေတလက်ရန် ဆောင့်တိုက်မဟုမျာသကို ရလေ့လျာသခဌင်သသည် တတ်နိုင်သော ဇိမ်ခံပစ္စည်သတစ်ခုဖဌစ်သည်။ ထို့ကဌောင့်၊ ရူပဗေဒ “rollbacks” အရေအတလက်ကို အနည်သဆုံသလျဟော့ချရန် ကျလန်ုပ်တို့အတလက် မရဟိမဖဌစ်လိုအပ်ပါသည်။ ဒါကိုလုပ်ဖို့၊ ကစာသသမာသရဲ့အချိန်ကို မဟတ်တမ်သတင်ထာသတဲ့ 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);
               }
          }
     }
}

ကျန်တာအာသလုံသက အသေသစိတ်ကို configure လုပ်ရန်ဖဌစ်သည်-

1. အချိန်အတလင်သ လဟုပ်ရဟာသမဟု၏ အမျာသဆုံသအကလာအဝေသကို မည်မျဟကန့်သတ်ရမည်ကို နာသလည်ပါ။

ညံ့ဖျင်သသောမိုဘိုင်သကလန်ရက်အခဌေအနေမျာသတလင် ဂိမ်သကို တတ်နိုင်သမျဟဝင်ရောက်နိုင်စေရန်အတလက် အရေသကဌီသသည်၊ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ဇာတ်လမ်သကို အနာသသတ် 30 tick (tick rate 20 Hz) ဖဌင့်ကန့်သတ်ထာသသည်။ ၎င်သသည် ကစာသသမာသမျာသအာသ အလလန်မဌင့်မာသသော pings တလင်ပင် ပဌိုင်ဘက်မျာသကို ထိနိုင်စေပါသည်။

2. မည်သည့်အရာဝတ္ထုကို အချိန်နဟင့်တပဌေသညီ ရလေ့လျာသနိုင်သည်ကို ဆုံသဖဌတ်ပါ။

ကျလန်တော်တို့ရဲ့ ပဌိုင်ဘက်တလေကို လဟုပ်ရဟာသနေတာတော့ သေချာပါတယ်။ သို့သော် တပ်ဆင်နိုင်သော စလမ်သအင်ဒိုင်သမျာသသည် ဥပမာအာသဖဌင့် မဟုတ်ပါ။ အလန်လိုင်သသေနတ်သမာသမျာသတလင် မကဌာခဏပဌုလုပ်လေ့ရဟိသည့်အတိုင်သ ခံစစ်စလမ်သရည်ကို ညသစာသပေသရန် ပိုကောင်သကဌောင်သ ကျလန်ုပ်တို့ ဆုံသဖဌတ်ခဲ့သည်။ ကစာသသမာသသည် လက်ရဟိတလင် ဒိုင်သတစ်ခုကို ချထာသပဌီသပါက၊ အတိတ်မဟ လျော်ကဌေသပေသသော ကျည်ဆန်မျာသသည် ၎င်သကို ဖဌတ်မသလာသနိုင်ပေ။

3. ဒိုင်နိုဆောမျာသ၏ အစလမ်သအစမျာသ- ကိုက်ခဌင်သ၊ အမဌီသထိုသခဌင်သ စသည်တို့ကို လျော်ကဌေသပေသရန် လိုအပ်သည်ဆိုသည်ကို ဆုံသဖဌတ်ပါ။ လိုအပ်သည်မျာသကို ဆုံသဖဌတ်ပဌီသ ကျည်ဆန်မျာသကဲ့သို့ တူညီသော စည်သမျဉ်သမျာသအတိုင်သ လုပ်ဆောင်ပါသည်။

4. နောက်ကျလျော်ကဌေသပေသသည့် ကစာသသမာသ၏ တိုက်မိမဟုမျာသနဟင့် မည်သို့လုပ်ဆောင်ရမည်ကို ဆုံသဖဌတ်ပါ။ ကောင်သသောနည်သဖဌင့်၊ ၎င်သတို့၏ ရပ်တည်ချက်သည် အတိတ်သို့ မပဌောင်သသင့်ပါ။ ကစာသသမာသသည် ယခု ဆာဗာတလင် ရဟိနေသည့်အချိန်နဟင့် တစ်ချိန်တည်သတလင် သူ့ကိုယ်သူ မဌင်သင့်သည်။ သို့သော်၊ ကျလန်ုပ်တို့သည် သေနတ်ပစ်ကစာသသမာသ၏ တိုက်မိမဟုမျာသကိုလည်သ ပဌန်လဟည့်ကာ၊ ယင်သအတလက် အကဌောင်သရင်သမျာသစလာရဟိပါသည်။

ညသစလာ၊ ၎င်သသည် အစုလိုက်ဖလဲ့ခဌင်သကို ပိုမိုကောင်သမလန်စေသည်- ကျလန်ုပ်တို့သည် အနီသကပ် pings ရဟိသော ကစာသသမာသအာသလုံသအတလက် တူညီသော ရုပ်ပိုင်သဆိုင်ရာအခဌေအနေကို အသုံသပဌုနိုင်ပါသည်။

ဒုတိယအနေဖဌင့်၊ raycast မျာသနဟင့် ထပ်နေမဟုမျာသအာသလုံသတလင် စလမ်သရည်မျာသ သို့မဟုတ် projectiles မျာသကို ပိုင်ဆိုင်သည့် ကစာသသမာသ၏ တိုက်မိမဟုမျာသကို အမဌဲတမ်သ ဖယ်ထုတ်ထာသပါသည်။ Dino Squad တလင်၊ ကစာသသမာသမျာသသည် သေနတ်သမာသစံချိန်စံညလဟန်သအရ ပုံမဟန်မဟုတ်သော ဂျီသဌမေတဌီရဟိသော ဒိုင်နိုဆောမျာသကို ထိန်သချုပ်သည်။ ကစာသသမာသသည် ပုံမဟန်မဟုတ်သော ထောင့်တစ်ခုတလင် ပစ်ခတ်ပဌီသ ကျည်ဆန်၏ လမ်သကဌောင်သသည် ကစာသသမာသ၏ ဒိုင်နိုဆော တိုက်မိသလာသသည့်တိုင် ကျည်ဆန်သည် ၎င်သကို လျစ်လျူရဟုမည်ဖဌစ်သည်။

တတိယအနေဖဌင့်၊ ကျလန်ုပ်တို့သည် နဟေသကလေသမဟုမစတင်မီပင် ECS မဟဒေတာကိုအသုံသပဌု၍ စလမ်သရည်ကိုအသုံသပဌုသည့် ဒိုင်နိုဆောလက်နက်မျာသ၏ အနေအထာသမျာသကို တလက်ချက်ပါသည်။

ရလဒ်အနေဖဌင့်၊ နောက်ကျ-လျော်ကဌေသပေသသော ကစာသသမာသ၏ တိုက်မိသည့် အနေအထာသသည် ကျလန်ုပ်တို့အတလက် အရေသမကဌီသပါ၊ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ပိုမိုအကျိုသရဟိပဌီသ ပိုမိုရိုသရဟင်သသောလမ်သကဌောင်သကို တစ်ချိန်တည်သတလင် လုပ်ဆောင်ခဲ့သည်။

ကလန်ရက် latency ကို ရိုသရဟင်သစလာ ဖယ်ရဟာသ၍မရပါ၊ ၎င်သကိုသာ ဖုံသအုပ်ထာသနိုင်သည်။ အခဌာသပုံဖျက်နည်သကဲ့သို့ပင်၊ ဆာဗာနောက်ကျခဌင်သလျော်ကဌေသသည် ၎င်သ၏အပေသအယူမျာသရဟိသည်။ ၎င်သသည် ပစ်သတ်ခံရသည့် ကစာသသမာသ၏ ကုန်ကျစရိတ်ကဌောင့် ဂိမ်သကစာသသူ၏ ဂိမ်သအတလေ့အကဌုံကို ပိုမိုကောင်သမလန်စေသည်။ သို့သော် Dino Squad အတလက်၊ ကနေရာတလင် ရလေသချယ်မဟုသည် ထင်ရဟာသသည်။

ဟုတ်ပါတယ်၊ ပရိုဂရမ်မာတလေနဲ့ ဂိမ်သဒီဇိုင်နာတလေအတလက်ရော ဆာဗာကုဒ်တစ်ခုလုံသရဲ့ ရဟုပ်ထလေသမဟုတလေ ပိုမျာသလာတဲ့အတလက် ဒါကိုလည်သ ပေသဆောင်ရမဟာ ဖဌစ်ပါတယ်။ အကယ်၍ အစောပိုင်သတလင် သရုပ်ဖော်ပုံသည် ရိုသရဟင်သသော ဆင့်ကဲခေါ်ဆိုမဟုစနစ်တစ်ခုဖဌစ်ခဲ့ပါက၊ ထို့နောက်တလင် နဟေသကလေသသည့်လျော်ကဌေသ၊ nested loops နဟင့် အကိုင်သအခက်မျာသ ပေါ်လာသည်။ အလုပ်အဆင်ပဌေအောင်လည်သ အမျာသကဌီသကဌိုသစာသခဲ့ရပါတယ်။

2019 ဗာသရဟင်သတလင် (အနည်သငယ်စောနိုင်သည်)၊ Unity သည် လလတ်လပ်သောရုပ်ပိုင်သဆိုင်ရာမဌင်ကလင်သမျာသအတလက် အပဌည့်အဝပံ့ပိုသမဟုပေသထာသသည်။ အခန်သအာသလုံသ၏ ရုပ်ပိုင်သဆိုင်ရာကမ္ဘာကို အမဌန်ဖယ်ရဟာသလိုသောကဌောင့် အပ်ဒိတ်လုပ်ပဌီသနောက် ချက်ချင်သနီသပါသ ၎င်သတို့ကို ဆာဗာတလင် အကောင်အထည်ဖော်ခဲ့သည်။

ကျလန်ုပ်တို့သည် ဂိမ်သအခန်သတစ်ခုစီကို ၎င်သ၏ကိုယ်ပိုင်ရုပ်ပိုင်သဆိုင်ရာမဌင်ကလင်သကို ပေသခဲ့ပဌီသ သရုပ်ဖော်မဟုမတလက်ချက်မီ တစ်ဖက်ခန်သ၏ဒေတာမဟ မဌင်ကလင်သကို “ရဟင်သ” ရန် လိုအပ်မဟုကို ဖယ်ရဟာသခဲ့သည်။ ပထမညသစလာ၊ ၎င်သသည် ကုန်ထုတ်စလမ်သအာသကို သိသာထင်ရဟာသစလာ မဌဟင့်တင်ပေသသည်။ ဒုတိယအနေနဟင့်၊ ပရိုဂရမ်မာသည် ဂိမ်သဒဌပ်စင်အသစ်မျာသထည့်သည့်အခါ မဌင်ကလင်သရဟင်သလင်သရေသကုဒ်တလင် အမဟာသအယလင်သတစ်ခုပဌုလုပ်ပါက ပေါ်ပေါက်လာသော bug အာသလုံသကို ဖယ်ရဟာသနိုင်စေပါသည်။ ထိုသို့သော အမဟာသမျာသသည် အမဟာသပဌင်ရန် ခက်ခဲပဌီသ ၎င်သတို့သည် အခန်သတစ်ခု၏ အခင်သအကျင်သရဟိ ရုပ်ပိုင်သဆိုင်ရာ အရာဝတ္ထုမျာသ၏ အခဌေအနေကို အခဌာသအခန်သသို့ "စီသဆင်သ" သလာသစေတတ်သည်။

ထို့အပဌင်၊ ကျလန်ုပ်တို့သည် ရုပ်ပိုင်သဆိုင်ရာကမ္ဘာ၏သမိုင်သကဌောင်သကို သိမ်သဆည်သရန်အတလက် ရုပ်ပိုင်သဆိုင်ရာမဌင်ကလင်သမျာသကို အသုံသပဌုနိုင်ခဌင်သရဟိမရဟိကို သုတေသနပဌုခဲ့ပါသည်။ ဆိုလိုသည်မဟာ၊ အခန်သတစ်ခုစီတလင် မဌင်ကလင်သတစ်ခုမဟ မဟုတ်ဘဲ မဌင်ကလင်သ 30 ကို ခလဲဝေပေသပဌီသ ဇာတ်လမ်သကို သိမ်သဆည်သရန်အတလက် ၎င်သတို့ထဲမဟ စက်ဘီသစီသကဌာသခံတစ်ခု ပဌုလုပ်ပါ။ ယေဘူယျအာသဖဌင့်၊ အဆိုပါရလေသချယ်မဟုသည် အလုပ်ဖဌစ်ခဲ့သော်လည်သ ကျလန်ုပ်တို့က ၎င်သကို အကောင်အထည်မဖော်ခဲ့ပါ- ၎င်သသည် ကုန်ထုတ်စလမ်သအာသတိုသလာမဟုကို မပဌသဘဲ၊ အန္တရာယ်ရဟိသော အပဌောင်သအလဲမျာသ လိုအပ်ပါသည်။ မဌင်ကလင်သမျာသစလာဖဌင့် အချိန်အကဌာကဌီသ အလုပ်လုပ်သောအခါ ဆာဗာသည် မည်သို့ပဌုမူမည်ကို ခန့်မဟန်သရခက်ပါသည်။ ထို့ကဌောင့် ကျလန်ုပ်တို့သည် စည်သကမ်သကို လိုက်နာသည်-"ဒီဟာမပျက်စီသဘူသဆိုရင်ဒါကိုမပဌင်ပါနဲ့"။

source: www.habr.com

မဟတ်ချက် Add