በኔትወርክ መዘግየት የማካካሻ ስልተ ቀመር ለሞባይል ተኳሽ የባለስቲክ ስሌት ሜካኒክን እንዴት እንደሰራን

በኔትወርክ መዘግየት የማካካሻ ስልተ ቀመር ለሞባይል ተኳሽ የባለስቲክ ስሌት ሜካኒክን እንዴት እንደሰራን

ሰላም፣ እኔ Nikita Brizhak ነኝ፣ በ Pixonic አገልጋይ ገንቢ። ዛሬ በሞባይል ብዙ ተጫዋች ውስጥ ስለ ላግ ማካካሻ ማውራት እፈልጋለሁ።

በሩሲያኛ ጨምሮ ስለ አገልጋይ መዘግየት ካሳ ብዙ ጽሑፎች ተጽፈዋል። ይህ አያስገርምም, ምክንያቱም ይህ ቴክኖሎጂ ከ 90 ዎቹ መገባደጃ ጀምሮ ባለብዙ ተጫዋች FPS ለመፍጠር በንቃት ጥቅም ላይ ውሏል. ለምሳሌ፣ ከመጀመሪያዎቹ ውስጥ አንዱ የሆነውን የኩዌክ ወርልድ ሞድ እናስታውሳለን።

በሞባይል ብዙ ተጫዋች ተኳሽ ዲኖ ስኳድ ውስጥም እንጠቀማለን።

በዚህ ጽሁፍ ግቤ አንድ ሺህ ጊዜ የተፃፈውን መድገም ሳይሆን የቴክኖሎጂ ቁልል እና ዋና የጨዋታ ባህሪያችንን ከግምት ውስጥ በማስገባት በጨዋታችን ውስጥ የላግ ማካካሻን እንዴት እንደተገበርን መንገር ነው።

ስለእኛ ዋና እና ቴክኖሎጂዎች በጥቂት ቃላት።

Dino Squad የመስመር ላይ የሞባይል PvP ተኳሽ ነው። ተጫዋቾቹ በተለያዩ መሳሪያዎች የታጠቁ ዳይኖሰርቶችን ይቆጣጠራሉ እና በ6v6 ቡድኖች እርስ በእርስ ይዋጋሉ።

ደንበኛው እና አገልጋዩ በአንድነት ላይ የተመሰረቱ ናቸው. አርክቴክቸር ለተኳሾች በጣም የታወቀ ነው፡ አገልጋዩ ባለስልጣን ነው፣ እና የደንበኛ-ጎን ትንበያ በደንበኞች ላይ ይሰራል። የጨዋታው ማስመሰል በቤት ውስጥ ECS በመጠቀም የተፃፈ እና በአገልጋዩ እና በደንበኛው ላይ ጥቅም ላይ ይውላል።

ስለ መዘግየት ማካካሻ ለመጀመሪያ ጊዜ ሰምተው ከሆነ፣ በጉዳዩ ላይ አጭር ማብራሪያ እዚህ አለ።

በባለብዙ-ተጫዋች FPS ጨዋታዎች፣ ግጥሚያው ብዙውን ጊዜ በሩቅ አገልጋይ ላይ ነው የሚመስለው። ተጫዋቾች ግባቸውን (ስለ ተጫኑ ቁልፎች መረጃ) ወደ አገልጋዩ ይልካሉ, እና በምላሹ, አገልጋዩ በተቀበለው መረጃ መሰረት የተሻሻለ የጨዋታ ሁኔታን ይልካል. በዚህ የመስተጋብር እቅድ የ"ወደፊት" ቁልፍን በመጫን እና የተጫዋቹ ባህሪ በስክሪኑ ላይ በሚንቀሳቀስበት ቅጽበት መካከል ያለው መዘግየት ሁል ጊዜ ከፒንግ የበለጠ ይሆናል።

በአካባቢያዊ አውታረ መረቦች ላይ ይህ መዘግየት (በታዋቂው የግቤት መዘግየት ተብሎ የሚጠራው) ላይታይ ይችላል, ከዚያም በኢንተርኔት ሲጫወቱ ገጸ ባህሪን ሲቆጣጠሩ "በበረዶ ላይ መንሸራተት" ስሜት ይፈጥራል. ይህ ችግር ለተንቀሳቃሽ ስልክ አውታረ መረቦች በእጥፍ ጠቃሚ ነው, ተጫዋቹ 200ms ፒንግ ሲኖረው አሁንም ጥሩ ግንኙነት እንደሆነ ይቆጠራል. ብዙ ጊዜ ፒንግ 350, እና 500, እና 1000 ms. ከዚያ ፈጣን ተኳሽ በግብዓት መዘግየት መጫወት የማይቻል ይሆናል።

የዚህ ችግር መፍትሔ የደንበኛ-ጎን የማስመሰል ትንበያ ነው. እዚህ ደንበኛው ራሱ ከአገልጋዩ ምላሽ ሳይጠብቅ ግቤቱን በተጫዋቹ ባህሪ ላይ ይተገበራል። እና መልሱ ሲደርሰው, ውጤቱን በቀላሉ ያወዳድራል እና የተቃዋሚዎችን አቀማመጥ ያሻሽላል. በዚህ ጉዳይ ላይ ቁልፍን በመጫን እና ውጤቱን በስክሪኑ ላይ በማሳየት መካከል ያለው መዘግየት አነስተኛ ነው.

እዚህ ላይ ያለውን ልዩነት መረዳት በጣም አስፈላጊ ነው-ደንበኛው ሁልጊዜ በመጨረሻው ግቤት መሰረት እራሱን ይስባል, እና ጠላቶች - ከአውታረ መረብ መዘግየት ጋር, ከአገልጋዩ ውስጥ ባለው መረጃ በቀድሞው ሁኔታ መሰረት. ያም ማለት በጠላት ላይ ሲተኮስ ተጫዋቹ ከራሱ ጋር በማነፃፀር ያለፈውን ጊዜ ያየዋል. ስለ ደንበኛ ትንበያ ተጨማሪ ቀደም ብለን ጽፈናል.

ስለዚህ የደንበኛው ትንበያ አንድ ችግርን ይፈታል, ነገር ግን ሌላ ይፈጥራል: ተጫዋቹ ጠላት ቀደም ሲል በነበረበት ቦታ, በአገልጋዩ ላይ, በተመሳሳይ ቦታ ላይ ሲተኮስ, ጠላት በዚያ ቦታ ላይሆን ይችላል. የአገልጋይ መዘግየት ማካካሻ ይህንን ችግር ለመፍታት ይሞክራል። መሳሪያ በተተኮሰ ጊዜ አገልጋዩ ተጫዋቹ በአካባቢው በተተኮሰበት ወቅት ያየውን የጨዋታውን ሁኔታ ይመልሳል እና ጠላትን መምታት ይችል እንደሆነ ያጣራል። መልሱ "አዎ" ከሆነ, ጠላት በአገልጋዩ ላይ ባይሆንም, መምታቱ ይቆጠራል.

ይህን እውቀት ይዘን፣ በዲኖ ስኳድ የአገልጋይ መዘግየት ማካካሻን መተግበር ጀመርን። በመጀመሪያ ደረጃ ደንበኛው ያየውን በአገልጋዩ ላይ እንዴት ወደነበረበት መመለስ እንደሚቻል መረዳት አስፈላጊ ነበር? እና በትክክል ምን መመለስ አለበት? በእኛ ጨዋታ የጦር መሳሪያ እና የችሎታ መምታት በጨረር እና በመደራረብ - ማለትም ከጠላት አካላዊ ተጋጭ አካላት ጋር በመገናኘት ይሰላል። በዚህ መሠረት ተጫዋቹ በአካባቢው "ያየው" የእነዚህ ግጭቶች አቀማመጥ በአገልጋዩ ላይ እንደገና ማባዛት ያስፈልገናል. በዚያን ጊዜ፣ Unity version 2018.x እንጠቀም ነበር። የፊዚክስ ኤፒአይ እዚያ የማይንቀሳቀስ ነው፣ አካላዊው ዓለም በአንድ ቅጂ አለ። ግዛቱን ለማዳን ምንም መንገድ የለም, ስለዚህም በኋላ ከሳጥኑ ውስጥ ወደነበረበት መመለስ ይቻላል. ስለዚህ ምን ማድረግ?

መፍትሄው ላይ ላዩን ነበር ፣ ሁሉም ንጥረ ነገሮች ቀደም ሲል ሌሎች ችግሮችን ለመፍታት በእኛ ጥቅም ላይ ውለዋል-

  1. ለእያንዳንዱ ደንበኛ ቁልፎቹን ሲጫኑ ተቃዋሚዎችን በምን ሰዓት እንዳየ ማወቅ አለብን። ይህንን መረጃ አስቀድመን ወደ ግቤት ፓኬጅ ጽፈናል እና የደንበኛውን ትንበያ ስራ ለማስተካከል ተጠቀምበት.
  2. የጨዋታ ግዛቶችን ታሪክ ማከማቸት መቻል አለብን። በውስጡ ነው የተቃዋሚዎችን ቦታ የምንይዘው (ስለዚህም ተጋጭዎቻቸው)። ቀደም ሲል በአገልጋዩ ላይ የስቴት ታሪክ ነበረን, ለመገንባት ተጠቀምንበት ዴልታስ. ትክክለኛውን ጊዜ በማወቅ በታሪክ ውስጥ ትክክለኛውን ሁኔታ በቀላሉ ማግኘት እንችላለን.
  3. አሁን የጨዋታውን ሁኔታ ከታሪክ በእጃችን ስላለን የተጫዋች መረጃን ከቁሳዊው ዓለም ሁኔታ ጋር ማመሳሰል መቻል አለብን። ያሉትን ተጋጭተው ያንቀሳቅሱ፣ የጎደሉትን ይፍጠሩ፣ ተጨማሪዎቹን ያጥፉ። ይህ አመክንዮ አስቀድሞ በእኛ የተፃፈ እና በርካታ የECS ስርዓቶችን ያካተተ ነው። በአንድ አንድነት ሂደት ውስጥ በርካታ የጨዋታ ክፍሎችን ለማቆየት ተጠቀምንበት። እና ግዑዙ ዓለም በሂደት አንድ ስለሆነ፣ በክፍሎች መካከል እንደገና ጥቅም ላይ መዋል ነበረበት። ከእያንዳንዱ የማስመሰል ምልክት በፊት የአካላዊውን አለም ሁኔታ "እንደገና እናስጀምረዋለን" እና አሁን ላለው ክፍል መረጃን እንደገና አስጀምረነዋል, በተቻለ መጠን Unity game ነገሮችን በአስቸጋሪ የመዋኛ ስርዓት እንደገና ለመጠቀም እንሞክራለን. ከጥንት ጀምሮ ለጨዋታው ሁኔታ ተመሳሳይ አመክንዮ ለመጥራት ይቀራል።

እነዚህን ሁሉ ንጥረ ነገሮች አንድ ላይ በማጣመር የአካላዊውን ዓለም ሁኔታ ወደ ትክክለኛው ጊዜ የሚመልስ “የጊዜ ማሽን” አግኝተናል። ኮዱ ያልተወሳሰበ ሆኖ ተገኘ፡-

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

ተኩሶችን እና ችሎታዎችን ለማካካስ ይህንን ማሽን እንዴት እንደሚጠቀሙበት ለማወቅ ቀርቷል።

በጣም ቀላል በሆነው ሁኔታ, መካኒኮች በአንድ ሂስካን ላይ ሲገነቡ, ሁሉም ነገር ግልጽ ይመስላል: ተጫዋቹ ከመተኮሱ በፊት, አካላዊውን ዓለም ወደ ተፈለገው ሁኔታ መመለስ, ሬይካስት ማድረግ, መምታት ወይም ማጣት እና መቁጠር ያስፈልግዎታል. ዓለምን ወደ መጀመሪያው ሁኔታው ​​ይመልሱ።

ነገር ግን በዲኖ ስኳድ ውስጥ እንደዚህ ያሉ መካኒኮች በጣም ጥቂት ናቸው! በጨዋታው ውስጥ ያሉት አብዛኛዎቹ መሳሪያዎች ፕሮጄክቶችን ይፈጥራሉ - ለብዙ የማስመሰል መዥገሮች የሚበሩ ረጅም ዕድሜ ያላቸው ጥይቶች (በአንዳንድ ሁኔታዎች በደርዘን የሚቆጠሩ መዥገሮች)። ከነሱ ጋር ምን ማድረግ አለባቸው, በምን ሰዓት መብረር አለባቸው?

В ጥንታዊ ጽሑፍ ስለ Half-Life networking ቁልል፣ የቫልቭ ሰዎች ተመሳሳይ ጥያቄ ጠየቁ፣ እና ምላሻቸው የፕሮጀክት መዘግየት ማካካሻ ችግር ያለበት እና በተሻለ ሁኔታ የሚወገድ ነው።

ይህ አማራጭ አልነበረንም፡ በፕሮጀክት ላይ የተመሰረቱ የጦር መሳሪያዎች የጨዋታው ዲዛይን ዋና ባህሪ ነበሩ። ስለዚህ የሆነ ነገር ማምጣት ነበረብን። ከትንሽ አእምሮአችን በኋላ፣ ለእኛ የሚጠቅሙ የሚመስሉ ሁለት አማራጮችን ቀረፅን።

1. ፕሮጀክቱን ከፈጠረው ተጫዋች ጊዜ ጋር እናያይዛለን. ለእያንዳንዱ ተጫዋች ለእያንዳንዱ ጥይት የአገልጋይ ማስመሰል እያንዳንዱ ምልክት ፣ አካላዊውን ዓለም ወደ ደንበኛ ሁኔታ እንመልሳለን እና አስፈላጊውን ስሌት እንሰራለን። ይህ አካሄድ በአገልጋዩ ላይ የተከፋፈለ ጭነት እና ሊገመት የሚችል የበረራ ጊዜ እንዲኖር አስችሎታል። የጠላት ትንበያዎችን ጨምሮ ሁላችንም በደንበኛው ላይ የተተነበዩ ስለነበሩ ትንበያዎች ለእኛ በጣም አስፈላጊ ነበር።

በኔትወርክ መዘግየት የማካካሻ ስልተ ቀመር ለሞባይል ተኳሽ የባለስቲክ ስሌት ሜካኒክን እንዴት እንደሰራን
በሥዕሉ ላይ በ 30 ኛው ምልክት ላይ ያለው ተጫዋች አስቀድሞ ሮኬት ይነድዳል: ጠላት በየትኛው አቅጣጫ እንደሚሮጥ ያያል እና የሮኬቱን ግምታዊ ፍጥነት ያውቃል። በአካባቢው, በ 33 ኛው ምልክት ላይ ዒላማውን እንደመታ ያያል. ለማካካሻ ምስጋና ይግባውና እሱ በአገልጋዩ ላይም ያገኛል

2. እንደ መጀመሪያው አማራጭ ሁሉንም ነገር እናደርጋለን ነገር ግን አንድ ጥይት የማስመሰል ምልክት ከቆጠርን በኋላ አናቆምም ፣ ግን በረራውን በተመሳሳይ የአገልጋይ ምልክት ውስጥ ማስመሰል እንቀጥላለን ፣ በእያንዳንዱ ጊዜ ጊዜውን ወደ አገልጋዩ አንድ በአንድ እናቀርባለን። ምልክት ማድረጊያ እና የግጭት ቦታዎችን ማዘመን። ከሁለት ነገሮች አንዱ እስኪሆን ድረስ ይህን እናደርጋለን፡-

  • ጥይቱ ጊዜው አልፎበታል። ይህ ማለት ስሌቶቹ አብቅተዋል, ማጣት ወይም መምታት ልንቆጥረው እንችላለን. እና ይህ ተኩሱ በተተኮሰበት ተመሳሳይ ምልክት ውስጥ ነው! ለእኛ፣ ይህ ፕላስ እና ተቀንሶ ሁለቱም ነበር። በተጨማሪም ፣ ለተኳሽ ተጫዋች ፣ ይህ በመምታት እና የጠላትን ጤና በመቀነስ መካከል ያለውን መዘግየት በእጅጉ ቀንሷል። ጉዳቱ ተቃዋሚዎች በተጫዋቹ ላይ ሲተኮሱ ተመሳሳይ ውጤት ተስተውሏል፡ ጠላት ቀርፋፋ ሮኬት የተኮሰ ይመስላል እና ጉዳቱ አስቀድሞ ተቆጥሯል።
  • ጥይቱ የአገልጋይ ጊዜ ላይ ደርሷል። በዚህ አጋጣሚ የማስመሰል ስራው በቀጣይ የአገልጋይ ምልክት ያለምንም ማካካሻ ይቀጥላል። ለዘገምተኛ ፕሮጄክቶች፣ ይህ በንድፈ ሀሳብ የፊዚክስ "ጥቅልሎች" ቁጥር ከመጀመሪያው አማራጭ ጋር ሲነጻጸር ሊቀንስ ይችላል። በተመሳሳይ ጊዜ በሲሙሌቱ ላይ ያለው ያልተስተካከለ ጭነት ጨምሯል፡ አገልጋዩ ወይ ሾል ፈትቶ ቆሞ፣ ከዚያም በአንድ የአገልጋይ ምልክት ላይ ለብዙ ጥይቶች ደርዘን የሚሆኑ የማስመሰል ቲኬቶችን አስላ።

በኔትወርክ መዘግየት የማካካሻ ስልተ ቀመር ለሞባይል ተኳሽ የባለስቲክ ስሌት ሜካኒክን እንዴት እንደሰራን
ልክ እንደ ቀድሞው ስዕል ተመሳሳይ ሁኔታ, ግን በሁለተኛው እቅድ መሰረት ይሰላል. ሚሳኤሉ ከአገልጋዩ ጋር በተመሳሳይ ጊዜ ተኩሱ በተከሰተበት ምልክት ላይ “ተያዘ” እና ጥቃቱ በሚቀጥለው ምልክት ላይ ሊቆጠር ይችላል። በ 31 ኛው ምልክት, በዚህ ሁኔታ, የዘገየ ማካካሻ ከአሁን በኋላ አይተገበርም.

በአፈፃፀማችን ውስጥ እነዚህ ሁለት አቀራረቦች በሁለት የኮድ መስመሮች ብቻ ይለያያሉ, ስለዚህ ሁለታችንም ታጥበናል, እና ለረጅም ጊዜ ከእኛ ጋር በትይዩ ነበሩ. በመሳሪያው መካኒኮች እና በጥይት ፍጥነት ላይ በመመስረት ለእያንዳንዱ ዳይኖሰር አንድ ወይም ሌላ አማራጭ መርጠናል. እዚህ ላይ የተለወጠው ነጥብ በሜካኒክ ጨዋታ ውስጥ መታየት ነበር “ጠላትን ብዙ ጊዜ እንደዚህ እና እንደዚህ አይነት ጊዜ ብትመታ እንደዚህ እና እንደዚህ ያለ ጉርሻ አግኝ። ተጫዋቹ ጠላት የሚመታበት ጊዜ አስፈላጊ የሆነበት ማንኛውም መካኒክ ከሁለተኛው አቀራረብ ጋር ጓደኛ ለመሆን ፈቃደኛ አልሆነም። ስለዚህ በመጨረሻ እኛ በመጀመሪያው አማራጭ ላይ ተቀመጥን, እና አሁን በሁሉም የጦር መሳሪያዎች እና በጨዋታው ውስጥ ያሉ ሁሉም ንቁ ችሎታዎች ላይ ተፈጻሚ ይሆናል.

በተናጠል, የአፈፃፀም ጉዳይን ማንሳት ተገቢ ነው. ይህ ሁሉ የሚዘገይ መስሎ ከታየኝ፡ እመልስላችኋለሁ፡ እንደዛ ነው። ግጭቶችን ማንቀሳቀስ፣ ማብራት እና ማጥፋት፣ አንድነት በጣም ቀርፋፋ ነው። በዲኖ Squad ውስጥ, "በከፋ" ሁኔታ ውስጥ, ብዙ መቶ ፕሮጄክቶች በአንድ ጊዜ በውጊያ ውስጥ ሊኖሩ ይችላሉ. እያንዳንዱን ፕሮጄክት ለየብቻ ለመቁጠር ግጭቶችን ማንቀሳቀስ ቅንጦት ነው። ስለዚህ፣ የፊዚክስን "የመመለሻ" ብዛት መቀነስ ለእኛ በጣም አስፈላጊ ነበር። ይህንን ለማድረግ በ 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);
               }
          }
     }
}

ዝርዝሮቹን ለማዋቀር ብቻ ይቀራል-

1. ከፍተኛውን የእንቅስቃሴ መጠን በጊዜ ውስጥ ምን ያህል እንደሚገድቡ ይረዱ.

በደካማ የሞባይል ኔትወርኮች ሁኔታዎች ጨዋታውን በተቻለ መጠን ተደራሽ ማድረግ ለእኛ አስፈላጊ ነበር፣ ስለዚህ ታሪኩን በ30 መዥገሮች ወሰን ገድበነዋል (በ 20 Hz የቲኬት መጠን)። ይህ ተጫዋቾች በጣም ከፍተኛ ፒንግ ላይ እንኳ ተቃዋሚዎችን እንዲመታ ያስችላቸዋል።

2. የትኞቹ ነገሮች በጊዜ ሊንቀሳቀሱ እንደሚችሉ እና እንደማይችሉ ይወስኑ.

እኛ በእርግጥ ተቃዋሚዎችን እናንቀሳቅሳለን። ነገር ግን የተጫኑ የኃይል መከላከያዎች, ለምሳሌ, አይደሉም. በመስመር ላይ ተኳሾች ውስጥ ብዙውን ጊዜ እንደሚደረገው እዚህ የመከላከያ ችሎታን ቅድሚያ መስጠት የተሻለ እንደሆነ ወስነናል። ተጫዋቹ ቀድሞውኑ ጋሻውን በአሁኑ ጊዜ ካስቀመጠ ፣ ያለፈው ጊዜ ካሳ የተከፈለ ጥይቶች በእሱ ውስጥ መብረር የለባቸውም።

3. የዳይኖሰርን ችሎታዎች ማካካስ ያስፈልግዎት እንደሆነ ይወስኑ: ንክሻ, ጅራት መምታት, ወዘተ. አስፈላጊ መሆኑን ወስነናል እና እንደ ጥይቶች ተመሳሳይ ደንቦችን እንሰራቸዋለን.

4. የዘገየ ማካካሻ እየተካሄደበት ባለው ተጫዋች ተጋጭ አካላት ላይ ምን እንደሚደረግ ይወስኑ። በጥሩ ሁኔታ, ቦታቸው ወደ ቀድሞው መቀየር የለበትም: ተጫዋቹ አሁን በአገልጋዩ ላይ በሚገኝበት በተመሳሳይ ጊዜ እራሱን ማየት አለበት. ሆኖም፣ የተኩስ ማጫወቻውን ተጋጭተው ወደ ኋላ እንመልሳለን፣ እና ለዚህ በርካታ ምክንያቶች አሉ።

በመጀመሪያ, ክላስተርን ያሻሽላል: ለሁሉም ቅርብ ፒንግ ያላቸው ተጫዋቾች ተመሳሳይ የፊዚክስ ሁኔታን መጠቀም እንችላለን.

በሁለተኛ ደረጃ፣ በሁሉም ጨረሮች እና መደራረቦች፣ ችሎታ ወይም ፕሮጄክቲል ያለውን የተጫዋች ግጭት ሁልጊዜ እናስወግዳለን። በዲኖ ስኳድ ውስጥ፣ ተጫዋቾች በተኳሾች መስፈርት መደበኛ ያልሆነ ጂኦሜትሪ ያላቸውን ዳይኖሰርስ ይቆጣጠራሉ። ተጫዋቹ ባልተለመደ አንግል ቢተኮስ እና የጥይቱ አቅጣጫ በተጫዋቹ ዳይኖሰር ግጭት ውስጥ ቢያልፍም ጥይቱ ችላ ይለዋል።

በሶስተኛ ደረጃ ፣ የዳይኖሰር መሳሪያውን አቀማመጥ ወይም የችሎታውን የትግበራ ነጥብ ከ ECS የተገኘው መረጃ መዘግየት ማካካሻ ከመጀመሩ በፊት እናሰላለን።

በውጤቱም, የላግ-ማካካሻ ተጫዋች ትክክለኛ አቀማመጥ ለእኛ አስፈላጊ አይደለም, ስለዚህ የበለጠ ውጤታማ እና በተመሳሳይ ጊዜ ቀላል መንገድ ወስደናል.

የአውታረ መረብ መዘግየት በቀላሉ ሊወገድ አይችልም, ጭምብል ብቻ ነው. ልክ እንደሌላው የመደበቂያ ዘዴ፣ የአገልጋይ መዘግየት ማካካሻ የራሱ የሆነ ግብይት አለው። በተተኮሰው ተጫዋች ወጪ የተኩስ ተጫዋችን የጨዋታ ልምድ ያሻሽላል። ለዲኖ ስኳድ ግን እዚህ ያለው ምርጫ ግልጽ ነበር።

በእርግጥ ይህ ሁሉ በጠቅላላው የአገልጋይ ኮድ ውስብስብነት መከፈል ነበረበት - ለፕሮግራም አውጪዎች እና ለጨዋታ ዲዛይነሮች። ቀደም ሲል ማስመሰል ቀላል ተከታታይ የሥርዓቶች ጥሪ ከሆነ ፣ ከዚያ በማዘግየት ማካካሻ ፣ የጎጆ ቀለበቶች እና ቅርንጫፎች በእሱ ውስጥ ታዩ። አብሮ ለመስራት ምቹ እንዲሆንም ብዙ ጥረት አድርገናል።

በ2019 ስሪት (ወይም ምናልባት ትንሽ ቀደም ብሎ)፣ አንድነት ለገለልተኛ የፊዚክስ ትዕይንቶች ሙሉ ድጋፍን ፕላስ ወይም መቀነስ አስተዋውቋል። ከዝማኔው በኋላ ወዲያውኑ በአገልጋዩ ላይ ተግባራዊ አደረግናቸው፣ ምክንያቱም በተቻለ ፍጥነት ለሁሉም ክፍሎች የጋራ የሆነውን አካላዊ ዓለምን ማስወገድ እንፈልጋለን።

ለእያንዳንዱ የጨዋታ ክፍል የራሱ የሆነ አካላዊ ትዕይንት ሰጥተናል እናም አስመሳዩን ከማስላትዎ በፊት ትዕይንቱን ከጎረቤት ክፍል መረጃ ላይ “ማጽዳት” አስፈላጊነትን አስወግደናል። በመጀመሪያ, ጉልህ የሆነ የአፈፃፀም እድገትን ሰጥቷል. በሁለተኛ ደረጃ ፣ ፕሮግራመር አዲስ የጨዋታ አካላትን ሲጨምር በትእይንት የማጽዳት ኮድ ላይ ስህተት ከሠራ የተከሰቱትን አጠቃላይ የሳንካዎች ክፍል ለማስወገድ አስችሎታል። እንዲህ ያሉ ስህተቶች ለማረም አስቸጋሪ ነበሩ, እና ብዙውን ጊዜ አንድ ክፍል ወደ ሌላ ክፍል ውስጥ "የሚፈስ" ቦታ ላይ አካላዊ ነገሮች ሁኔታ አስከትሏል.

በተጨማሪም፣ አካላዊ ትዕይንቶችን የሥጋዊውን ዓለም ታሪክ ለማከማቸት ይቻል እንደሆነ አንዳንድ ጥናቶችን አድርገናል። ይህም ማለት፣ ሁኔታዊ በሆነ መልኩ፣ ለእያንዳንዱ ክፍል አንድ ትዕይንት ሳይሆን 30 ትዕይንቶችን ለመመደብ እና ታሪክን የሚያከማችበት ሳይክል ቋት እንዲሰራ። በአጠቃላይ, አማራጩ እየሰራ ነው, ነገር ግን እኛ አልተተገበርነውም: ምንም አይነት እብድ የአፈፃፀም ትርፍ አላሳየም, ነገር ግን በጣም አደገኛ ለውጦችን ይፈልጋል. ከብዙ ትዕይንቶች ጋር ለረጅም ጊዜ ሲሰራ አገልጋዩ እንዴት እንደሚሠራ ለመተንበይ አስቸጋሪ ነበር። ስለዚህ ደንቡን ተከትለን ነበር፡-ካልተሰበረ አያስተካክሉ».

ምንጭ: hab.com

አስተያየት ያክሉ