War Thunder background
Fyzika kolizí ve hře - vysvětlení
Pozornost! Zastaralý formát zpráv. Obsah se nemusí zobrazovat správně.
Pozor! Tato novinka byla původně publikována na staré verzi webových stránek. V některé verzi webových prohlížečů se může zobrazovat chybně.


V poslední době jsme obdrželi řadu stížností na kolizní model vozidel, respektive na chování vozidel při vzájemné kolizi v prostředí War Thunderu. Anton Judincev, ředitel společnosti Gaijin Entertainment a vedoucí developerského týmu, proto připravil vysvětlení způsobu, jakým pracuje fyzikální model ve War Thunderu.


Nejprve krátké shrnutí základních funkcí fyzikálního modelu ve hře

  1. hráčův klient odesílá data ovládání na server. Server tyto příkazy obdrží a aplikuje je do herního prostředí retrospektivně (tj. vzhledem k latenci připojení jsou ve hře ztvárněny příkazy, které již byly v minulosti odeslány.
  2. server odešle klientovi „autorizační požadavek“ neboli „skutečnou“ pozici hráčova vozidla v herním světě
  3. když se tento požadavek dostane ke klientovi, je již „starý“, což je dáno prodlevou danou pingem. Server proto aktualizuje „starou“ pozici hráčova vozidla pomocí všech příkazů, obdržených během dané prodlevy.
  4. výsledkem je „nová“ pozice hráčova vozidla v herním světě.

Ačkoliv výše uvedené není zrovna snadné na pochopení, a jedná se o řešení velmi náročné na výpočetní výkon (ve srovnání například s herní sérii Battlefield, jejíž net code je postaven na ryze retrospektivním určování polohy), řešení užité pro War Thunder podává velmi dobrý výkon při prakticky jakékoliv hodnotě latence (v rozumných mezích, samozřejmě).



Offline zážitek v online hře?

To hráči poskytuje velmi slušnou ovladatelnost a odezvu srovnatelnou s hraním v módu jednoho hráče – podmínkou je ale splnění tří věcí:

Přijatelná hodnota ztráty paketů (packet loss). Jak jste mohli z výše načrtnutého algoritmu pochopit, klient závisí na včasném dodání určitých dat serverem. Pokud je pak ping nestálý, tj. trpí výraznými výkyvy, výsledkem je trhavý pohyb. Stabilní 100 ms ping je proto často o mnoho lepší než „průměrný“ ping 50 ms, který kolísá mezi 10 a 100 milisekundami.

Právě ztráta paketů je důvodem, proč se více vyplatí hrát War Thunder skrze kabelové připojení a nikoliv přes bezdrátový wi-fi přenos. Data jsou sice zasílána s určitou redundancí, nicméně pokud jsou všechny ovládací příkazy ztraceny během odezvy trvající 700 ms, stávají se příliš starými na to, aby je mohl server užít pro aktualizaci hráčovy polohy - nezapomeňte, že ve hře nejste sami a poloha vašeho vozidla je užívána klienty ostatních hráčů pro aktualizaci jejich vlastní polohy. Ve výsledku by proto mohla nastat situace, že kdybychom na aktualizaci ovládacích příkazů a hráčovy pozice nastavili limit dejme tomu 10 vteřin, vozidla by se na straně serveru doslova teleportovala po mapě, tudíž by to tak viděly i všechny hráčské klienty. Pokud se ale vaše ztráta paketů pohybuje v rozmezí 3-5%, vše by mělo fungovat zcela normálně. Rovněž myslete na to, že ztráta paketů, kterou hra zobrazuje, není stoprocentně přesným ukazatelem, neboť je vypočítávána pouze na základě „spolehlivého“ spojení – u nestabilního spojení by výpočet ztráty paketů nebyl možný. I zde je důležitá stabilita; pokud ztráta paketů bude kolísat, ani zmiňovaných 3-5% vám nepomůže.

Samotný klient nijak nekomunikuje s klienty ostatních hráčů. Ve hře samotné tomu tak samozřejmě je, 99% času ale zabírá klidová fáze, kdy spolu klienty nekomunikují, a ze zbylého procenta zabírá 99% času boj. Hlavně střelba je velmi zábavnou formou interakce (z hlediska síťového kódu), neboť v naprosté většině případů střela buď neprobije pancíř, či se odrazí, tudíž pokud dojde k nějaké malé desynchronizaci (například pokud jste se s tankem takřka nezřetelně „teleportovali“ vpřed před 100 milisekundami, ačkoliv vám nepřítel před 200 milisekundami rozstřelil pás), vše vypadá ve hře v pořádku a nijak nenarušuje zážitek ze hry.

Ve hře samotné tomu tak samozřejmě je, 99% času ale zabírá klidová fáze, kdy spolu klienty nekomunikují, a ze zbylého procenta zabírá 99% času boj. Hlavně střelba je velmi zábavnou formou interakce (z hlediska síťového kódu), neboť v naprosté většině případů střela buď neprobije pancíř, či se odrazí, tudíž pokud dojde k nějaké malé desynchronizaci (například pokud jste se s tankem takřka nezřetelně „teleportovali“ vpřed před 100 milisekundami, ačkoliv vám nepřítel před 200 milisekundami rozstřelil pás), vše vypadá ve hře v pořádku a nijak nenarušuje zážitek ze hry.



Síťový kód War Thunderu

Pokud je mi známo, tento druh síťového kódu byl vyvinut speciálně pro War Thunder. Standard pro ostatní akční hry ukazuje každého klienta interpolovaně v minulosti (Battlefield, Counter-Strike), což dává komukoliv s vyšším pingem lepší pozici (a rovněž si to moc „nerozumí“ s kolizním modelem, neboť dané pohyby se v daný okamžik už staly), případně se neužívá žádná dodatečná interpolace (např. Q3), kde je potřeba předvídat vaší hodnotu pingu a střílet s dostatečným předsazením (což by v případě kolizí rovněž nefungovalo, neboť kdokoliv s vysokou hodnotou latence by byl ve velmi špatné pozici). Existuje zde řešení nazývané „thin client“, kdy je hráči ukazováno pouze to, co odeslal server, a veškeré předvídání či kompenzování latence při aplikaci ovládacích příkazů se děje „v budoucnosti“ (byť s určitou prodlevou). Tento způsob užívá mnoho her typu MMORPG (a pár her jiných žánrů), nicméně ani tento model by nebyl pro War Thunder přijatelný vzhledem k tomu, že War Thunder obsahuje tělesa pohybující se velkou rychlostí (letouny), případně pohybující se na zešikmené ploše (pozemní vozidla v některých situacích). Použití „thin client“ řešení by pak znamenalo nižší odezvu ovládání a celkovou těžkopádnost.

Neexistuje tak ideální bezproblémové řešení, pokud se bavíme o online hraní. Ano, pokud bychom většinu výpočtů přenesli na stranu klienta, mohli bychom kolizní model o mnoho vylepšit, stávající řešení ale v naprosté většině případů funguje skvěle.



Řešení kolizí ve hře

Nejvýraznější výjimkou, kde ale tento systém má rezervy, jsou kolize vozidel (zvláště kolize hráči ovládaných vozidel). Kolizní model je obecně řečeno jednou z nejobtížnějších součástí herního engine na vymodelování, kdy musíte vytvořit takový model, aby nejenom správně řešil fyziku kolize, ale který by rovněž „věřil“ posledním ovládacím příkazům klienta (nikoliv jeho pozici) a dokázal by tak správně aktualizovat ovládací příkazy v daném časovém rámci pingu.

Z pohledu třetího klienta (např. při sledování replayů) se věci stávají ještě podivnějšími. Klient nejenom retrospektivně aktualizuje ovládací příkazy po samotné kolizi , ale v replayi rovněž vidíte „budoucnost“ neboli pozici vozidla ovládaného klientem, jež rovněž aktualizuje ovládací příkazy. V některých záznamech, které nám byly zaslány, jsme proto mohli pozorovat velmi podivné chování tanků, kdy tanky například prováděly přemety na rovném povrchu, a to i bez kontaktu s jinými tanky (záznamy z tankového biatlonu či zkušebních jízd se dají nalézt skrze Google).

Tato pozorování, která v běžné hře vypadají normálně, se na záznamu jeví jako nenormální. Zčásti je to způsobeno faktem, že na záznamu nikdy neuvidíte, co se doopravdy stalo na straně serveru, zčásti pak je původcem sám server, který při vytváření záznamu musí znovu vytvářet danou událost za velmi specifických podmínek. Ve War Thunderu server odesílá do klienta pozice, nikoliv příkazy, tudíž nikdo ve hře není zpomalován ostatními hráči s pomalejším připojením. Obvykle platí přímá úměra, že čím menší ping, tím lepší budete mít podmínky pro přesnou střelbu, a tím lepší bude vaše povědomí o okolí. Samotné ovládání vozidla ale není závislé na latenci (pouze na ztrátě paketu), kromě situací, kdy narazíte do jiného vozidla, jelikož ovládací příkazy jsou normou, a kolize zase tak časté nejsou. Dostatečně dobré online řešení kolizního modelu navíc stejně nemůže existovat, pokud bychom nechtěli do hry zavést buď „pomalý“ model (neboli ovládání ovlivňované latencí), či „thin client“ řešení. Současný síťový kód nám tak umožňuje hráčům poskytnout obecně velmi dobrou zkušenost, a navíc dovoluje hráčům z celého světa hrát na jednom bojišti.

Tento článek bych rád zakončil doporučením – snažte se pokud možno nevrážet příliš silně do svých spoluhráčů. I ve skutečnosti mohlo při tvrdém nárazu dojít ke zranění osádky či poškození vybavení vozidla…a navíc byste si mohli poškrábat lak.


War Thunder tým

Přečtěte si více:
Funkce Skupiny
Paralaxa a úprava zaměřovače pro bojová vozidla
Nový hangár pro letadla i bojová vozidla
B-29 Superfortress/Tu-4 – nová tvář obra