Sveiki, es esmu Å ikita Brižaks, serveru izstrÄdÄtÄjs no Pixonic. Å odien es vÄlos runÄt par nobÄ«des kompensÄÅ”anu mobilajÄ vairÄku spÄlÄtÄju spÄlÄ.
Par servera kavÄÅ”anÄs kompensÄciju ir rakstÄ«ti daudzi raksti, arÄ« krievu valodÄ. Tas nav pÄrsteidzoÅ”i, jo Ŕī tehnoloÄ£ija ir aktÄ«vi izmantota vairÄku spÄlÄtÄju FPS izveidÄ kopÅ” 90. gadu beigÄm. PiemÄram, jÅ«s varat atcerÄties QuakeWorld mod, kas bija viens no pirmajiem, kas to izmantoja.
Å ajÄ rakstÄ mans mÄrÄ·is nav atkÄrtot to, kas jau ir rakstÄ«ts tÅ«kstoÅ” reižu, bet gan pastÄstÄ«t, kÄ mÄs savÄ spÄlÄ ieviesÄm nobÄ«des kompensÄciju, Åemot vÄrÄ mÅ«su tehnoloÄ£iju steku un spÄles galvenÄs funkcijas.
Daži vÄrdi par mÅ«su garozu un tehnoloÄ£ijÄm.
Dino Squad ir tÄ«kla mobilÄ PvP Å”ÄvÄja. SpÄlÄtÄji kontrolÄ dinozaurus, kas aprÄ«koti ar dažÄdiem ieroÄiem, un cÄ«nÄs savÄ starpÄ 6 pret 6 komandÄs.
Gan klients, gan serveris ir balstÄ«ti uz Unity. ArhitektÅ«ra ir diezgan klasiska Å”ÄvÄjiem: serveris ir autoritÄrs, un klienta prognozÄÅ”ana darbojas uz klientiem. SpÄles simulÄcija ir uzrakstÄ«ta, izmantojot iekÅ”Äjo ECS, un tiek izmantota gan serverÄ«, gan klientÄ.
Ja Ŕī ir pirmÄ reize, kad dzirdat par kavÄjuma kompensÄciju, Å”eit ir Ä«ss ieskats Å”ajÄ jautÄjumÄ.
VairÄku spÄlÄtÄju FPS spÄlÄs maÄs parasti tiek simulÄts attÄlÄ serverÄ«. SpÄlÄtÄji nosÅ«ta savu ievadi (informÄciju par nospiestajiem taustiÅiem) serverim, un, atbildot uz to, serveris nosÅ«ta viÅiem atjauninÄtu spÄles stÄvokli, Åemot vÄrÄ saÅemtos datus. Izmantojot Å”o mijiedarbÄ«bas shÄmu, aizkave starp pogas uz priekÅ”u nospieÅ”anu un brÄ«di, kad spÄlÄtÄja varonis pÄrvietojas uz ekrÄna, vienmÄr bÅ«s lielÄka nekÄ ping.
KamÄr lokÄlajos tÄ«klos Ŕī aizkave (tautÄ saukta ievades aizkave) var bÅ«t nepamanÄma, spÄlÄjot internetÄ, tÄ rada āslÄ«dÄÅ”anas pa leduā sajÅ«tu, kontrolÄjot tÄlu. Å Ä« problÄma ir divtik aktuÄla mobilajiem tÄ«kliem, kur par lielisku savienojumu joprojÄm tiek uzskatÄ«ts gadÄ«jums, kad spÄlÄtÄja ping ir 200 ms. Bieži vien ping var bÅ«t 350, 500 vai 1000 ms. Tad kļūst gandrÄ«z neiespÄjami spÄlÄt Ätro Å”ÄvÄju ar ievades nobÄ«di.
Å Ä«s problÄmas risinÄjums ir klienta puses simulÄcijas prognozÄÅ”ana. Å eit klients pats piemÄro ievadi spÄlÄtÄja varonim, negaidot atbildi no servera. Un, kad tiek saÅemta atbilde, tÄ vienkÄrÅ”i salÄ«dzina rezultÄtus un atjaunina pretinieku pozÄ«cijas. Aizkave starp taustiÅa nospieÅ”anu un rezultÄta parÄdÄ«Å”anu ekrÄnÄ Å”ajÄ gadÄ«jumÄ ir minimÄla.
Å eit ir svarÄ«gi saprast niansi: klients vienmÄr zÄ«mÄ sevi pÄc pÄdÄjÄs ievades, bet ienaidnieki - ar tÄ«kla aizkavi, saskaÅÄ ar iepriekÅ”Äjo stÄvokli no servera datiem. Tas ir, Å”aujot uz ienaidnieku, spÄlÄtÄjs redz viÅu pagÄtnÄ attiecÄ«bÄ pret sevi. VairÄk par klientu prognozÄÅ”anu mÄs rakstÄ«jÄm iepriekÅ”.
TÄdÄjÄdi klienta prognozÄÅ”ana atrisina vienu problÄmu, bet rada citu: ja spÄlÄtÄjs Å”auj vietÄ, kur agrÄk bija ienaidnieks, serverÄ«, Å”aujot tajÄ paÅ”Ä punktÄ, ienaidnieks var vairs neatrasties Å”ajÄ vietÄ. Servera kavÄÅ”anÄs kompensÄcija mÄÄ£ina atrisinÄt Å”o problÄmu. Kad tiek izÅ”auts ierocis, serveris atjauno spÄles stÄvokli, ko spÄlÄtÄjs redzÄja lokÄli Å”Äviena brÄ«dÄ«, un pÄrbauda, āāvai viÅÅ” tieÅ”Äm varÄja trÄpÄ«t ienaidniekam. Ja atbilde ir ājÄā, trÄpÄ«jums tiek ieskaitÄ«ts, pat ja ienaidnieks tajÄ brÄ«dÄ« vairs neatrodas serverÄ«.
Izmantojot Ŕīs zinÄÅ”anas, mÄs sÄkÄm ieviest servera kavÄÅ”anÄs kompensÄciju Dino Squad. PirmkÄrt, mums bija jÄsaprot, kÄ serverÄ« atjaunot to, ko klients redzÄja? Un kas tieÅ”i ir jÄatjauno? MÅ«su spÄlÄ ieroÄu un spÄju trÄpÄ«jumi tiek aprÄÄ·inÄti, izmantojot staru pÄrraides un pÄrklÄjumus, tas ir, mijiedarbojoties ar ienaidnieka fiziskajiem sadursmÄm. AttiecÄ«gi mums vajadzÄja reproducÄt Å”o sadursmju pozÄ«ciju, ko spÄlÄtÄjs āredzÄjaā lokÄli, serverÄ«. TajÄ laikÄ mÄs izmantojÄm Unity versiju 2018.x. Fizikas API tur ir statiska, fiziskÄ pasaule pastÄv vienÄ eksemplÄrÄ. Nav iespÄjams saglabÄt tÄ stÄvokli un pÄc tam atjaunot to no kastes. TÄtad, ko darÄ«t?
RisinÄjums bija uz virsmas; visus tÄ elementus mÄs jau izmantojÄm citu problÄmu risinÄÅ”anai:
Katram klientam mums ir jÄzina, kurÄ brÄ«dÄ« viÅÅ” redzÄja pretiniekus, nospiežot taustiÅus. MÄs jau esam ierakstÄ«juÅ”i Å”o informÄciju ievades pakotnÄ un izmantojÄm to, lai pielÄgotu klienta prognozi.
Mums ir jÄspÄj saglabÄt spÄļu stÄvokļu vÄsturi. TieÅ”i tajÄ mÄs noturÄsim pretinieku (un lÄ«dz ar to arÄ« viÅu sadursmju) pozÄ«cijas. Mums serverÄ« jau bija valsts vÄsture, mÄs to izmantojÄm, lai izveidotu deltas. Zinot pareizo laiku, mÄs varÄtu viegli atrast pareizo stÄvokli vÄsturÄ.
Tagad, kad mums ir pieejams spÄles stÄvoklis no vÄstures, mums ir jÄspÄj sinhronizÄt spÄlÄtÄju datus ar fiziskÄs pasaules stÄvokli. EsoÅ”ie kolÄ«deri - pÄrvietojiet, trÅ«kstoÅ”ie - izveidojiet, nevajadzÄ«gie - iznÄ«ciniet. ArÄ« Ŕī loÄ£ika jau bija uzrakstÄ«ta un sastÄvÄja no vairÄkÄm ECS sistÄmÄm. MÄs to izmantojÄm, lai vienÄ Unity procesÄ rÄ«kotu vairÄkas spÄļu istabas. Un tÄ kÄ fiziskÄ pasaule katram procesam ir viena, tÄ bija atkÄrtoti jÄizmanto starp telpÄm. Pirms katras simulÄcijas atzÄ«mÄÅ”anas mÄs "atiestatÄ«jÄm" fiziskÄs pasaules stÄvokli un atkÄrtoti to inicializÄjÄm ar paÅ”reizÄjÄs telpas datiem, cenÅ”oties pÄc iespÄjas vairÄk izmantot Unity spÄles objektus, izmantojot gudru apvienoÅ”anas sistÄmu. Atlika tikai atsaukties uz to paÅ”u pagÄtnes spÄles stÄvokļa loÄ£iku.
Saliekot visus Å”os elementus kopÄ, mÄs ieguvÄm ālaika maŔīnuā, kas varÄtu atgriezt fiziskÄs pasaules stÄvokli uz pareizo brÄ«di. Kods izrÄdÄ«jÄs vienkÄrÅ”s:
Atlika tikai izdomÄt, kÄ izmantot Å”o maŔīnu, lai viegli kompensÄtu kadrus un spÄjas.
VienkÄrÅ”ÄkajÄ gadÄ«jumÄ, kad mehÄnika ir balstÄ«ta uz vienu trÄpÄ«jumu skenÄÅ”anu, Ŕķiet, ka viss ir skaidrs: pirms spÄlÄtÄjs Å”auj, viÅam ir jÄatgriež fiziskÄ pasaule vÄlamajÄ stÄvoklÄ«, jÄveic raycast, jÄuzskaita sitiens vai netrÄpÄ«jums un atgriezt pasauli sÄkotnÄjÄ stÄvoklÄ«.
Bet tÄdu mehÄniÄ·u Dino Squad ir ļoti maz! LielÄkÄ daļa spÄlÄ esoÅ”o ieroÄu rada Å”ÄviÅus - ilgstoÅ”as āālodes, kas lido pÄc vairÄkÄm simulÄcijas ÄrcÄm (dažos gadÄ«jumos desmitiem ÄrÄu). Ko ar viÅiem darÄ«t, cikos viÅiem vajadzÄtu lidot?
Š sens raksts par Half-Life tÄ«kla steku puiÅ”i no Valve uzdeva to paÅ”u jautÄjumu, un viÅu atbilde bija Å”Äda: Å”ÄviÅa lag kompensÄcija ir problemÄtiska, un no tÄ labÄk izvairÄ«ties.
Mums nebija Ŕīs iespÄjas: uz Å”ÄviÅiem balstÄ«ti ieroÄi bija galvenÄ spÄles dizaina iezÄ«me. TÄpÄc mums bija kaut kas jÄizdomÄ. PÄc nelielas prÄta vÄtras mÄs formulÄjÄm divas iespÄjas, kas, Ŕķiet, darbojas:
1. MÄs piesienam Å”ÄviÅu tÄ spÄlÄtÄja laikam, kurÅ” to izveidoja. Katrs servera simulÄcijas Ä·eksÄ«tis, katra spÄlÄtÄja katra lode, mÄs atgriezÄ«sim fizisko pasauli uz klienta stÄvokli un veicam nepiecieÅ”amos aprÄÄ·inus. Å Ä« pieeja ļÄva nodroÅ”inÄt sadalÄ«tu slodzi uz serveri un paredzamu Å”ÄviÅu lidojuma laiku. PrognozÄjamÄ«ba mums bija Ä«paÅ”i svarÄ«ga, jo mums ir visi lÄdiÅi, tostarp ienaidnieka lÄdiÅi, prognozÄti uz klienta.
AttÄlÄ spÄlÄtÄjs ar atzÄ«mi 30, gaidot, izÅ”auj raÄ·eti: viÅÅ” redz, kurÄ virzienÄ skrien ienaidnieks, un zina aptuveno raÄ·etes Ätrumu. LokÄli viÅÅ” redz, ka trÄpÄ«ja mÄrÄ·Ä« pie 33. Ä·eksÄ«Å”a. Pateicoties nobÄ«des kompensÄcijai, tas parÄdÄ«sies arÄ« serverÄ«
2. DarÄm visu tÄpat kÄ pirmajÄ variantÄ, bet, saskaitot vienu lodes simulÄcijas Ä·eksÄ«ti, neapstÄjamies, bet turpinÄm simulÄt tÄ lidojumu viena servera Ä·eksÄ«Å”a ietvaros, katru reizi tuvinot tÄ laiku serverim pa vienam atzÄ«mÄjiet un atjauniniet sadursmju pozÄ«cijas. MÄs to darÄm, lÄ«dz notiek viena no divÄm lietÄm:
Lodei ir beidzies derÄ«guma termiÅÅ”. Tas nozÄ«mÄ, ka aprÄÄ·ini ir beiguÅ”ies, varam skaitÄ«t garÄm vai sitienu. Un tas ir pie tÄs paÅ”as Ä·eksÄ«Å”a, kurÄ tika izdarÄ«ts Å”Äviens! Mums tas bija gan pluss, gan mÄ«nuss. Pluss - jo Å”ÄvÄjam tas ievÄrojami samazinÄja aizkavi starp sitienu un ienaidnieka veselÄ«bas samazinÄÅ”anos. NegatÄ«vÄ puse ir tÄda, ka tas pats efekts tika novÄrots, kad pretinieki Å”Äva uz spÄlÄtÄju: Ŕķiet, ka ienaidnieks izÅ”Äva tikai lÄnu raÄ·eti, un bojÄjumi jau bija ieskaitÄ«ti.
Lode ir sasniegusi servera laiku. Å ajÄ gadÄ«jumÄ tÄ simulÄcija turpinÄsies nÄkamajÄ servera atzÄ«mÄÅ”anÄ bez kavÄÅ”anÄs kompensÄcijas. LÄniem Å”ÄviÅiem tas teorÄtiski varÄtu samazinÄt fizikas apgÄÅ”anÄs skaitu salÄ«dzinÄjumÄ ar pirmo iespÄju. TajÄ paÅ”Ä laikÄ palielinÄjÄs nevienmÄrÄ«ga simulÄcijas slodze: serveris vai nu darbojÄs dÄ«kstÄvÄ, vai arÄ« vienÄ servera Ä·eksÄ« aprÄÄ·inÄja duci simulÄcijas ÄrÄu vairÄkÄm aizzÄ«mÄm.
Tas pats scenÄrijs kÄ iepriekÅ”ÄjÄ attÄlÄ, bet aprÄÄ·inÄts pÄc otrÄs shÄmas. RaÄ·ete āpaÄ·Äraā servera laiku tajÄ paÅ”Ä Ä·eksÄ«Å”a brÄ«dÄ«, kad notika Å”Äviens, un trÄpÄ«jumu var ieskaitÄ«t jau ar nÄkamo Ä·eksÄ«ti. Pie 31. Ä·eksÄ«Å”a Å”ajÄ gadÄ«jumÄ nobÄ«des kompensÄcija vairs netiek piemÄrota
MÅ«su ievieÅ”anÄ Å”Ä«s divas pieejas atŔķīrÄs tikai ar pÄris koda rindiÅÄm, tÄpÄc mÄs izveidojÄm abas, un ilgu laiku tÄs pastÄvÄja paralÄli. AtkarÄ«bÄ no ieroÄa mehÄnikas un lodes Ätruma katram dinozauram izvÄlÄjÄmies vienu vai otru variantu. Pagrieziena punkts Å”eit bija parÄdÄ«Å”anÄs mehÄnikas spÄlÄ, piemÄram, "ja tu trÄpÄ«si ienaidniekam tik daudz reižu tÄdÄ un tÄdÄ laikÄ, saÅemiet tÄdu un tÄdu bonusu." JebkurÅ” mehÄniÄ·is, kurÄ spÄlÄtÄja sitiena ienaidniekam bija svarÄ«ga loma, atteicÄs strÄdÄt ar otro pieeju. TÄpÄc mÄs izvÄlÄjÄmies pirmo iespÄju, un tagad tas attiecas uz visiem ieroÄiem un visÄm aktÄ«vajÄm spÄjÄm spÄlÄ.
AtseviŔķi ir vÄrts izvirzÄ«t jautÄjumu par veiktspÄju. Ja jÅ«s domÄjÄt, ka tas viss bremzÄs, es atbildu: tÄ ir. Unity diezgan lÄni pÄrvietojas kolaideros un tos ieslÄdz un izslÄdz. Dino komandÄ "sliktÄkajÄ" gadÄ«jumÄ kaujÄ vienlaikus var bÅ«t vairÄki simti Å”ÄviÅu. KodinÄtÄju pÄrvietoÅ”ana, lai saskaitÄ«tu katru Å”ÄviÅu atseviŔķi, ir nepieejama greznÄ«ba. TÄpÄc mums bija absolÅ«ti nepiecieÅ”ams samazinÄt fizikas āatcelÅ”anuā skaitu. Lai to izdarÄ«tu, ECS izveidojÄm atseviŔķu komponentu, kurÄ ierakstÄm spÄlÄtÄja laiku. MÄs to pievienojÄm visÄm entÄ«tijÄm, kurÄm nepiecieÅ”ama kavÄÅ”anÄs kompensÄcija (Å”ÄviÅi, spÄjas utt.). Pirms sÄkam apstrÄdÄt Å”Ädas entÄ«tijas, mÄs tÄs lÄ«dz Å”im brÄ«dim sagrupÄjam un apstrÄdÄjam kopÄ, katrai klasterim vienreiz atgriežot fizisko pasauli.
Å ajÄ posmÄ mums ir vispÄrÄji strÄdÄjoÅ”a sistÄma. TÄ kods nedaudz vienkÄrÅ”otÄ formÄ:
1. Saprast, cik ļoti ierobežot maksimÄlo kustÄ«bas attÄlumu laikÄ.
Mums bija svarÄ«gi padarÄ«t spÄli pÄc iespÄjas pieejamÄku slikto mobilo tÄ«klu apstÄkļos, tÄpÄc ierobežojÄm stÄstu ar 30 atzÄ«mÄm (ar Ä·eksÄ«Å”u Ätrumu 20 Hz). Tas ļauj spÄlÄtÄjiem trÄpÄ«t pretiniekiem pat pie ļoti lieliem pingiem.
2. Nosakiet, kurus objektus var pÄrvietot laikÄ un kurus nevar.
MÄs, protams, iekustinÄm pretiniekus. Bet, piemÄram, uzstÄdÄmi enerÄ£ijas vairogi tÄdi nav. MÄs nolÄmÄm, ka labÄk ir dot priekÅ”roku aizsardzÄ«bas spÄjÄm, kÄ tas bieži tiek darÄ«ts tieÅ”saistes Å”ÄvÄju spÄlÄs. Ja spÄlÄtÄjs jau ir ievietojis vairogu tagadnÄ, pagÄtnes lodes, kas kompensÄ nokavÄÅ”anos, nedrÄ«kst lidot tam cauri.
3. Izlemiet, vai ir nepiecieÅ”ams kompensÄt dinozauru spÄjas: sakodiens, astes sitiens utt. MÄs izlÄmÄm, kas nepiecieÅ”ams, un apstrÄdÄjam tos pÄc tÄdiem paÅ”iem noteikumiem kÄ lodes.
4. Nosakiet, ko darÄ«t ar spÄlÄtÄja, kuram tiek veikta nobÄ«des kompensÄcija, sadursmÄm. LabÄ nozÄ«mÄ, viÅu pozÄ«cijai nevajadzÄtu novirzÄ«ties pagÄtnÄ: spÄlÄtÄjam vajadzÄtu redzÄt sevi tajÄ paÅ”Ä laikÄ, kurÄ viÅÅ” tagad atrodas serverÄ«. TomÄr mÄs arÄ« atceļam Å”ÄvÄja spÄlÄtÄja sadursmes, un tam ir vairÄki iemesli.
PirmkÄrt, tas uzlabo klasterizÄciju: mÄs varam izmantot vienu un to paÅ”u fizisko stÄvokli visiem spÄlÄtÄjiem ar tuvu ping.
OtrkÄrt, visos raycasts un pÄrklÄjumos mÄs vienmÄr izslÄdzam tÄ spÄlÄtÄja kolÄ«derus, kuram pieder spÄjas vai Å”ÄviÅi. SpÄlÄ Dino Squad spÄlÄtÄji kontrolÄ dinozaurus, kuriem pÄc Å”ÄvÄja standartiem ir diezgan nestandarta Ä£eometrija. Pat ja spÄlÄtÄjs Å”auj neparastÄ leÅÄ·Ä« un lodes trajektorija iet caur spÄlÄtÄja dinozauru triecienu, lode to ignorÄs.
TreÅ”kÄrt, mÄs aprÄÄ·inÄm dinozaura ieroÄa pozÄ«cijas vai spÄju pielietojuma punktu, izmantojot ECS datus pat pirms nobÄ«des kompensÄcijas sÄkuma.
LÄ«dz ar to atpalicÄ«bas kompensÄtÄ spÄlÄtÄja kolÄ«deru reÄlÄ pozÄ«cija mums ir mazsvarÄ«ga, tÄpÄc gÄjÄm pa produktÄ«vÄku un reizÄ vienkÄrÅ”Äku ceļu.
TÄ«kla latentumu nevar vienkÄrÅ”i noÅemt, to var tikai maskÄt. TÄpat kÄ jebkura cita maskÄÅ”anas metode, servera kavÄÅ”anÄs kompensÄcijai ir savi kompromisi. Tas uzlabo tÄ spÄlÄtÄja spÄļu pieredzi, kurÅ” Å”auj uz tÄ spÄlÄtÄja rÄÄ·ina, uz kuru tiek Å”auts. TomÄr Dino Squad izvÄle Å”eit bija acÄ«mredzama.
Protams, par to visu bija jÄmaksÄ arÄ« servera koda pieaugoÅ”Ä sarežģītÄ«ba kopumÄ ā gan programmÄtÄjiem, gan spÄļu dizaineriem. Ja agrÄk simulÄcija bija vienkÄrÅ”s secÄ«gs sistÄmu izsaukums, tad ar nobÄ«des kompensÄciju tajÄ parÄdÄ«jÄs ligzdotas cilpas un zari. MÄs arÄ« veltÄ«jÄm daudz pūļu, lai ar to bÅ«tu Ärti strÄdÄt.
2019. gada versijÄ (un varbÅ«t nedaudz agrÄk) Unity pievienoja pilnÄ«gu atbalstu neatkarÄ«gÄm fiziskÄm ainÄm. MÄs tos ieviesÄm serverÄ« gandrÄ«z uzreiz pÄc atjauninÄÅ”anas, jo gribÄjÄm Ätri atbrÄ«voties no visÄm telpÄm kopÄ«gÄs fiziskÄs pasaules.
Katrai spÄļu telpai pieŔķīrÄm savu fizisko ainu un tÄdÄjÄdi novÄrsÄm nepiecieÅ”amÄ«bu ānotÄ«rÄ«tā ainu no blakus esoÅ”Äs istabas datiem pirms simulÄcijas aprÄÄ·inÄÅ”anas. PirmkÄrt, tas ievÄrojami palielinÄja produktivitÄti. OtrkÄrt, tas ļÄva atbrÄ«voties no veselas kļūdu klases, kas radÄs, ja programmÄtÄjs pieļÄva kļūdu ainas tÄ«rÄ«Å”anas kodÄ, pievienojot jaunus spÄles elementus. Å Ädas kļūdas bija grÅ«ti atkļūdot, un tÄs bieži izraisÄ«ja fizisko objektu stÄvokli vienÄ telpÄ, kas "ieplÅ«st" citÄ telpÄ.
TurklÄt mÄs veicÄm dažus pÄtÄ«jumus par to, vai fiziskÄs ainas var izmantot fiziskÄs pasaules vÄstures glabÄÅ”anai. Tas ir, nosacÄ«ti, katrai telpai pieŔķiriet nevis vienu ainu, bet 30 ainas un izveidojiet no tÄm ciklisku buferi, kurÄ glabÄt stÄstu. KopumÄ variants izrÄdÄ«jÄs sekmÄ«gs, taÄu mÄs to neieviesÄm: tas neuzrÄdÄ«ja nekÄdu traku produktivitÄtes pieaugumu, bet prasÄ«ja diezgan riskantas izmaiÅas. Bija grÅ«ti paredzÄt, kÄ serveris uzvedÄ«sies, ilgstoÅ”i strÄdÄjot ar tik daudzÄm ainÄm. TÄpÄc mÄs ievÄrojÄm noteikumu: "Ja tas nav salauzts, to nevar novÄrst'.