Quomodo Mechanica calculi ballistice amplificavimus ad jaculatorem mobilem cum retis algorithmi latency compensatio?

Quomodo Mechanica calculi ballistice amplificavimus ad jaculatorem mobilem cum retis algorithmi latency compensatio?

Hi, ego Nikita Brizhak, cultor elit a Pixonic. Hodie loqui vellem de compensatione pigri in lusoribus mobilibus.

Multa vasa scripta sunt de servo pigrae mercedis, in iis qui in Russian sunt. Quod mirum non est, cum haec technologia active adhibita est in creatione lusorum FPS post 90s nuper. Exempli gratia meminisse potes QuakeWorld mod, qui fuit primus uti.

Utimur etiam eo in pluribus mobilibus nostris surculus Dino Squadensi.

In hoc articulo, propositum meum non est repetere quae iam millies scripta sunt, sed ut referamus quomodo pigram mercedis in ludo nostro perficiamus, ratione habita nostrae technologiae acervus et nucleus lusionis notarum.

Paucis verbis de cortex et arte nostra.

Dino Squad Rebus mobile network est PvP surculus. Histriones dinosaurus moderantur variis armis instructi et in 6v6 iugis inter se pugnant.

Utriusque clientis et minister in unitate sunt. Architectura iaculatoribus satis classica est: minister auctoritatis est, et praedicatio clientis in clientibus operatur. Ludus simulationis usus in domo ECS scriptum est et in utroque ministro et cliente ponitur.

Si hoc primum audisti de pigritia mercedis, hic brevis excursio in exitum est.

In lusoribus FPS ludis, par in remoto servo simulari solet. Histriones suum initus (notitiae de clavibus expressis) servo mittunt, et cum servo respondendo mittit illis tabulae ludi renovatae habita ratione data recepta. Cum hoc schemate commercio, mora inter clavem anteriorem instans et momentum lusoris character in screen semper maior erit quam ping.

Dum in reticulis localibus haec mora (vulgo lag input lag vocatur) latens esse potest, cum per Internet ludens facit affectum "delabentis in glaciem" cum indolem moderans. Quaestio haec ad retiacula mobilia bis pertinet, ubi causa cum histrionum pingendi 200 ms adhuc optimum nexum censetur. Saepe ping potest 350, D, M aut ms. Tunc fere impossibile fit cum input lag ieiunium jaculatorem ludere.

Solutio huius problematis simulationis lateris clientis est praesagium. Hic cliens ipse characterem initus ad ludio ludius applicat, sine exspectatione responsionis a servo. Et cum responsum recipitur, simpliciter eventus et updates positiones adversariorum comparat. Mora inter clavem urgeat et eventum in screen ostendens in casu minimo est.

Refert hic nuance intelligere: client semper se trahit secundum suum ultimum input, et inimicos - cum mora retiacula, secundum statum priorem a notitia servo. Hoc est, cum in hostem figens, lusor eum in praeteritum sibi cognatum videt. De clientis vaticinium antea scripsimus.

Ita praesagium clientis unam quaestionem solvit, sed aliam creat: si lusor pampinus in eo loco, in quo hostis erat antea, in servo, cum in eodem puncto figeret, hostis in eo loco diutius esse non poterit. Servo pigri compensationem hanc quaestionem solvere conatur. Cum telum accensum est, minister statum ludum restituit quem ludio ludius localiter tempore iecit vidit et impedit num vere hostem ferire posset. Si responsum "est," ictus numeratur, etiam si hostis in illo loco servo diutius non est.

Hac scientia armati, in Dino Squad recompensationem pigri operis efficere coepimus. Primum intelligere debemus quomodo restituat servo quod vidit cliens? Et quidnam resti- tuendum est? In nostro ludo, hits ab armis et facultatibus computantur per radios et obduces, id est, per interactiones cum collidentium hostium corporis. Proinde necesse est nos horum collidentium positionem effingere, quam histrio "videbat" localiter in calculonis servi. Eo tempore utentes versioni Unitarum 2018.x. Physica API stata est, res corporea in uno exemplari exstat. Nulla via est suum statum salvare et postea eam ex arca restituere. Quid igitur faciam?

Solutio in superficie erat: omnia elementa eius iam erant a nobis ad solvendum alias quaestiones;

  1. Pro quolibet cliente, sciendum est quo tempore adversarios vidit quando claves pressit. Iam haec informationes scripsimus in initus involucrum et ea ad defensionem clientis accommodemus.
  2. Non opus est ut historiam ludi civitatum condere possimus. In hoc loco adversariorum (itaque concursus eorum) tenebimus. Historiam publicam iam habuimus in calculonis servi, eam aedificare consuevimus deltas. Tempus opportunitatis cognoscentes, facile in historia ius civitatis reperire potuimus.
  3. Nunc ut ipsum ex historia statu in manu, nos postulo ut cum statu rerum naturalium notitia nisl synchronize. Collidatores existentes - moventur, desunt - creant, superfluae sunt - destruunt. Haec logica etiam iam scripsit et ex pluribus systematibus ECS constabat. Plures cubicula lusoria in una Unitate processu usi sumus. Et quia mundus physicus est unus per processum, oportuit reddi inter cubicula. Ante quamque ricinum simulationis, "reset" statum mundi physici et illum reinitiaverunt cum notitia pro currenti conclavi, quaerentes unitatem rei quam maxime per callidum ratiocinandi obiectas venationes. Reliquum erat, ut eandem rationem ad ludum civitatis praeteritum vocaret.

His omnibus elementis simul dispositis, "machinam temporis" consecuti sumus, quae statum mundi physici ad tempus opportunum revolvere potuit. In codice simplex evasit;

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

Omnia quae restabant erant instare quomodo machinam hanc utendi ad ictus facultatesque facile compenset.

In simplicissimo casu, cum mechanici in uno hitscan fundantur, omnia plana esse videntur: antequam surculis scaenicis, necesse est mundum physicum ad statum desideratum revolvere, radicastum facere, ictum aut deesset; mundum redire ad statum initialem.

Sed paucissimi tales mechanici sunt in Dino Squadensi! Plurima armorum in ludo proiecta creant - diuturnae glandes quae ad plures ricini simulationis volant (in aliquibus casibus, justo ricinorum). Quid cum illis agant, quo tempore fugiant?

В articulus antiquus de media-Vita retis acervus, guys e Valve eandem quaestionem interrogaverunt, eorumque responsum hoc fuit: mercedis proiecti pigri est problematicum, et melius est eam vitare.

Hanc optionem non habemus: arma proiecto-substructio praecipua notae ludi designandi erant. Veniamus itaque aliquid cum. Post quaedam brainstorming duo optiones, quae laborare videbantur, elaboravimus;

1. Proiectum ligamus tempori lusori qui eum creavit. Omnis ricinum servientis simulationis, in omni globulo cuiusque lusori, mundum corporalem ad statum clientem revolvimus ac necessarias calculas exercemus. Hic aditus effecit ut distributum sarcinam in servo praevideret et tempus proiectorum fugae praevideret. Praedictio maxime momenti apud nos fuit, cum omnes projectiones, etiam proiectae hostes, in cliente praenuntiata habeamus.

Quomodo Mechanica calculi ballistice amplificavimus ad jaculatorem mobilem cum retis algorithmi latency compensatio?
In tabula lusor ricinum 30 telum praeoccupat: videt in utram partem hostis currit et proximam velocitatem missili cognoscit. Localiter videt se scopo in 33 ricinum ferire. Gratias pro pigri recompensatio, etiam apparebit in calculonis servi

2. Omnia eadem facimus quae in prima optione, sed uno ricino glandis simulationis computato non cessamus, sed fugam in eodem servo ricini simulare pergimus, quotiescumque suum tempus appropinquat servo. singula tick et adaequationis collider positiones. Hoc facimus, donec unum e duobus fiat;

  • Glans expiratus. Id est calculis peractis, numerare possumus Miss vel hit. Et hoc ad idem ricinum in quo jocum uritur! Hoc enim nobis et plus et minus fuit. Plus - quia hoc signanter pro ludio ludius mora inter hit et diminutionem in valetudine hostium redegit. Inclinatio idem observatum est, cum adversarii in lusorem accensi sunt: ​​hostes, ut videtur, lento eruca accensi sunt, et iam damnum adnumeratum est.
  • Glans servo tempus perventum est. Hoc in casu, eius simulatio in proximo ricinum servo sine ullius mercedis tarditate permanebit. Ad tarda missilia, hoc theoretice numerum reducere physicorum volvulorum comparatorum ad primam optionem. Eodem tempore, inaequale onus in simulatione augetur: server vel otiosa erat, vel in uno ricinum servo computabat duodecim simulationis ricini per plures glandes.

Quomodo Mechanica calculi ballistice amplificavimus ad jaculatorem mobilem cum retis algorithmi latency compensatio?
Idem missionis ut in tabula praecedente, sed secundum schema secundum rationem computatur. Missile "raptum" cum ministris eodem tempore ricini quo iecit incidit, et ictus numerari potest tam mane ac ricinum proximum. Ad 31 ricinum, hoc in casu, compensatio pigri non amplius applicatur

In nostra exsecutione, hae duae aditus in duobus lineis codicis sicut diversae sunt, ut utramque creavimus, et diu in parallelis extiterunt. Secundum Mechanicas teli et celeritas glandis, unam vel aliam optionem pro singulis dinosauris elegimus. Metae hic erat aspectus in ludo mechanicorum sicut "si hostem toties in tali et tali tempore percusseris, tale et tale bonum habe." Quilibet mechanicus, ubi tempus quo lusor hostem percussit, magnas partes egit cum secundo accessu laborare noluerunt. Ita nos cum prima optione finivimus, nunc ad omnes arma et omnes vires activas in ludo applicatur.

Seorsim est operae pretium suscitare exitum. Si omnia haec tardant, respondeo: est. Unitas admodum tarda est ad collidentes movendos et illos interdum convertendo. In Dino Squad, in casu "pessimo", possunt esse plures centum missiles simul in pugna existentes. Coligeri movens singuli singulos proiectos computare est immoderata luxuria. Ergo necessarium fuit nobis numerum physicorum "rollbacks" minuere. Ad hoc faciendum, elementum separatum in ECS in quo nunc lusoris tempus commemoramus, creavimus. Illud addimus omnibus entibus quae compen- sionem requirunt (projectilia, facultates, &c.). Antequam huiusmodi entia incipimus dispensare, eas hoc tempore coniungimus et simul processimus, semel pro unoquoque botro mundum physicum revolvendo.

Hac in scaena ratio plerumque operandi habemus. Eius signum in forma aliquantulum simplicior;

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

Residuum erat singula configurare;

1. Intellige quantam maximam distantiam motus in tempore finiret.

Praecipuum erat nobis ut lusum pervium quam maxime in condicionibus reticulorum mobilium pauperum faceremus, sic fabulam cum margine 30 ricinorum finivimus (cum 20 Hz ricinum rate). Hoc permittit histriones ferire adversarios etiam in altissima pings.

2 .

Nos vero adversarios movemus. Sed scuta energiae installabiles, exempli gratia, non sunt. Placuit nobis melius esse facultatem defensivam exa- ratus, quod saepe fit in jaculatoribus online. Si lusor scutum in praesenti iam collocavit, glandes lag-compensatae ex praeterito per illud volare non debent.

3. Decernere an necesse sit ingeniorum dinosaurus satisfacere: morsum, caudam percutiens, etc. Decernimus ea quae opus erant ac processus secundum easdem regulas ac glandes.

4. Decernite quid faciendum sit cum collisoribus scaenici pro quo pigri compensatio exercetur. Bona via, eorum positio in praeteritum transferre non debet: lusor se videre debet eodem tempore quo nunc est in calculonis servi. Tamen etiam collidentes scenopegiorum scaenicorum revolvimus, et plures causae huius sunt.

Primum, pampineis melior est: eodem statu corporis uti possumus omnibus histriones cum pings arctis.

Secundo, in omnibus radiosis et lapsibus semper collidentes scaenicorum excludimus, qui facultates vel proiectantia possidet. In Dino Squad, histriones dinosaurus temperantiae, quae magis geometriam non vexillum habent ab signis iaculatoribus. Etiamsi lusor iacit ad angulum insolitum et trajectoria glandis per collider ludio ludius dinosaurus transit, glans eam negleget.

Tertio, positiones teli dinosauri vel punctum applicationis facultatis utendi notitia ex ECS computamus etiam ante initium laganae mercedis.

Quam ob rem, verus positio collidentium lusoris lagani compensationis est levis pro nobis, sic faciliorem simulque simpliciorem viam cepimus.

Latentia retis simpliciter tolli non potest, solum obumbrari potest. Sicut alia ratio dissimulationis, mercedis pigri server negotiationes suas habet. Ludum experientiam praestat histrionis, qui sumptu jaculationis scaenici iaculari. Pro Dino Squad, tamen electio hic apparebat.

Utique, haec omnia etiam solvenda sunt per auctam incomplexitatem servi codicis sicut totius - programmatores et lusus designatores. Si antea simulatio simplex systematum sequentem vocatum fuit, tunc cum pigra compensatio, in eo apparuerunt loramenta et rami. Nos etiam multum laboris impendimus, ut id commodius laborandum sit.

In versione MMXIX (et fortasse paulo ante) Unitas plena subsidia ad scaenas physicas independentes addidit. In calculonis servi statim post renovationem adacti sumus, quod mundum physicum commune omnibus cubiculis celeriter removere voluimus.

Singulis lusibus cubiculi sui corporis scaenam dedimus et sic necessitatem "purgare" exstingui e notitia cubiculi proximae antequam simulationem computaremus. Uno modo, quantum ad augmentum in fructibus. Secundo, effecit ut totum genus cimicum ortorum tolleret, si programmator errorem in scaena tersus codicem fecit, cum nova elementa venationis adderet. Tales errores debug difficiles erant, et saepe in statu rerum corporalium consecuti sunt in scaena unius loci "fluentis" in alterum conclave.

Praeterea nonnullas investigationes invenimus in scaenas physicas num physicae mundi historiae condere possent. Hoc est, sub condicione, non unam scenam singulis cellis collocant, sed 30 scenas, et ex iis quiddam cyclicum efficies, in quo congregem fabulam. In genere, optio versatur ad operandum, sed eam non ad effectum deducendi: non ostendit aliquem insanum augeri in fructibus, sed potius periculosas mutationes requiri. Difficilis erat praedicere quomodo minister cum tot scaenae diu se gereret laborans. Ideo regulam secuti sumus: "Si fractum non sit, noli id ​​reficere".

Source: www.habr.com

Add a comment