В پخوانی مقاله د نیم ژوند شبکې سټیک په اړه ، د والو څخه هلکانو ورته پوښتنه وکړه ، او د دوی ځواب دا و: د پروجیکل لیګ خساره ستونزه ده ، او دا غوره ده چې له دې څخه مخنیوی وشي.
موږ دا اختیار نه درلود: د پروژې پراساس وسلې د لوبې ډیزاین کلیدي ځانګړتیا وه. نو موږ باید د یو څه سره راشي. د یو څه فکر کولو وروسته، موږ دوه اختیارونه جوړ کړل چې داسې ښکاري چې کار کوي:
1. موږ پروجیکټیل د هغه لوبغاړي وخت سره تړلی چې دا یې رامینځته کړی. د سرور سمولو هر ټیک ، د هر لوبغاړي هرې ګولۍ لپاره ، موږ فزیکي نړۍ د پیرودونکي حالت ته بیرته راګرځوو او اړین محاسبې ترسره کوو. دې کړنالرې دا ممکنه کړې چې په سرور کې توزیع شوي بار او د پروجیکلونو د وړاندوینې وړ الوتنې وخت ولري. وړاندوینه کول په ځانګړي توګه زموږ لپاره خورا مهم و ، ځکه چې موږ ټول پروجیکلونه لرو ، پشمول د دښمن پروژې ، په پیرودونکي کې وړاندوینه شوې.
په انځور کې، لوبغاړی په ټیک 30 کې یو توغندی په تمه کې ویشي: هغه ګوري چې دښمن په کوم لوري روان دی او د توغندي نږدې سرعت پوهیږي. په محلي توګه هغه ګوري چې هغه په 33 ټیک کې هدف په نښه کړ. د ځنډ جبران څخه مننه، دا به په سرور کې هم ښکاره شي
2. موږ هر څه د لومړي اختیار په څیر ترسره کوو، مګر، د مرمۍ سمولو یو ټیک شمیرلو سره، موږ نه درېږو، مګر د ورته سرور ټیک کې د الوتنې سمولو ته دوام ورکوو، هر ځل چې خپل وخت سرور ته نږدې کوي. یو په یو ټیک کول او د کلاډر موقعیتونه تازه کول. موږ دا تر هغه وخته کوو چې د دوو شیانو څخه یو پیښ شي:
ګولۍ ختمه شوې ده. دا پدې مانا ده چې حسابونه پای ته رسیدلي، موږ کولی شو یو له لاسه ورکړو یا مات کړو. او دا په هماغه ټیک کې دی چې په کې ډزې شوې وې! زموږ لپاره دا دواړه جمع او منفي وو. یو پلس - ځکه چې د شوټینګ لوبغاړي لپاره دا د پام وړ د برید او د دښمن روغتیا کې کمښت ترمینځ ځنډ کم کړی. منفي اړخ دا دی چې ورته اغیزه لیدل شوې کله چې مخالفین په لوبغاړي ډزې کوي: دښمن، داسې ښکاري چې یوازې یو ورو راکټ توغولی، او زیان یې دمخه شمیرل شوی و.
بلیټ د سرور وخت ته رسیدلی. په دې حالت کې، د هغې سمول به په راتلونکي سرور ټیک کې پرته له کوم ځنډ جبران ته دوام ورکړي. د ورو پروجیکلونو لپاره، دا کولی شي په تیوریکي توګه د لومړي اختیار په پرتله د فزیک رول بیکونو شمیر کم کړي. په ورته وخت کې ، په سمولیشن کې غیر مساوي بار ډیر شوی: سرور یا بې کاره و ، یا په یو سرور ټیک کې دا د څو ګولیو لپاره د درجن سمولیشن ټیک محاسبه کوي.
د تیر انځور په څیر ورته سناریو، مګر د دویم سکیم مطابق حساب شوی. توغندی د سرور وخت سره په ورته ټیک کې "کیچ اپ" شو چې ډزې وشوې، او برید د راتلونکي ټیک په څیر شمیرل کیدی شي. په 31 ټیک کې، پدې حالت کې، د ځنډ جبران نور نه پلي کیږي
زموږ په تطبیق کې، دا دوه طریقې یوازې د کوډ په څو کرښو کې توپیر درلود، نو موږ دواړه رامینځته کړل، او د اوږدې مودې لپاره دوی په موازي توګه شتون درلود. د وسلو میکانیکونو او د مرمۍ سرعت پورې اړه لري، موږ د هر ډیناسور لپاره یو یا بل انتخاب غوره کړ. دلته د بدلون نقطه د میخانیکونو په لوبو کې ظاهري بڼه وه لکه "که تاسو په داسې وخت کې څو ځله دښمن وویشتئ، داسې او داسې بونس ترلاسه کړئ." هر میکانیک چیرې چې هغه وخت چې لوبغاړی دښمن ته زیان رسوي مهم رول لوبولی د دوهم چلند سره کار کولو څخه انکار وکړ. نو موږ د لومړي اختیار سره پای ته ورسیږو ، او دا اوس په لوبو کې ټولو وسلو او ټولو فعالو وړتیاو باندې پلي کیږي.
په جلا توګه، دا د فعالیت مسله پورته کولو ارزښت لري. که تاسو فکر کاوه چې دا ټول به شیان ورو کړي، زه ځواب ورکوم: دا دی. یووالی د ټکر کونکو په حرکت کولو او د دوی په فعالولو او بندولو کې خورا ورو دی. په ډینو سکواډ کې، په "خورا بد حالت" سناریو کې، په جګړه کې په ورته وخت کې څو سوه توغندي شتون لري. په انفرادي ډول د هر پروجیکل شمیرلو لپاره د ټکرونو حرکت کول د نه منلو وړ عیش و آرام دی. له همدې امله، دا زموږ لپاره خورا اړین و چې د فزیک "رول بیکس" شمیر کم کړو. د دې کولو لپاره، موږ په 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);
}
}
}
}