Technologie internetových her podruhé

Minule jsme si pověděli něco o kvalitách multiplayer her, nostalgicky si zavzpomínali a především rozebrali TCP/IP protokol a pověděli si, kterak ho využít pro internetové hraní. Samotné hlavní téma článku však přichází na řadu až dnes - na praktickém příkladu si ukážeme, jak může taková komunikace internetové hry mezi samotnými hráči a herním serverem vypadat.
Technologie internetových her podruhé
Jak jsem již napsal, často diskutovanými tématy, co se on-line her týče, jsou ping, procento ztracených packetů a rychlost přenosu dat. Ping představuje dobu, za kterou náš počítač dostane odpověď od serveru, tj. dobu, po kterou námi vyslaný packet putuje po Internetu k cílovému počítači a zpět. Nejčastěji se měří v milisekundách (1 ms= 1 tisícina sekundy). Ideální by byl ping nulový, tj. odpověď okamžitá. Bohužel tomu tak není. Na menších sítích typu LAN se při praktickém multiplayer hraní pohybuje ping v rozmezí 4-30 ms. Na Internetu dosáhneme podobného pingu při pevném spojení, přes modem je to ovšem většinou kolem 200-300 ms (v lepším případě). Co způsobuje tuto latenci?

Především neuvěřitelná složitost a celková struktura Internetu. Ten se skládá z milionů počítačů propojených v statisících typech sítích mnoha topologií, navzájem propojených tisíci a tisíci routery a gatewayi. Každému takovému routeru chvíli trvá, než obslouží právě náš packet a pošle ho dál, k dalšímu routeru atd. až k cílovému počítači. Jelikož každý router zpracovává miliony dalších packetů, musí právě ten náš chvíli počkat a již zde se nabírají ony milisekundy. Pokud se připojujeme k cílovému počítači dislokovanému ve velké vzdálenosti od našeho, musí náš packet projít neuvěřitelnou pavučinou, než dojde k cíli. Zde se mnohdy nasbírá i více, než oněch 300 ms. S tím souvisí i otázka procenta ztracených packetů, neboť mnohdy se v takové pavučině sítí a routerů náš packet může ztratit. Zvláště pokud je poslán na nefungující router, či síť, je pravděpodobnost jeho dojití téměř nulová. Není tak divu, že může dojít třeba i k 60-100% ztrátě packetů. Pro Internetové hraní her je nanejvýše důležité mít právě ping co nejnižší a procento ztráty packetů pokud možno blížící se nule. Ovšem packet může putovat nejen po sítích fyzických (optika, kabel...), ale i vzduchem - přes satelit. Právě satelitní putování packetů již ze samotné podstaty rychlosti přenosu světla způsobuje mnohdy nepoužitelně vysoké hodnoty pro on-line hraní. Pokud je např. satelit ve výšce 30000 km nad zemí (tuším +- geostac.výška), trvá packetu, než se dostane ze Země k satelitu rovných 100ms. Od satelitu putuje na Zem dalších 100 ms, fyzicky tedy máme min.200 ms. V praxi ještě trvá další ms cesta po routerech a fyzických sítích, takže ping dále narůstá. Proto je důležité, pokud chceme hrát např. Quake, abychom se připojovali k co nejbližšímu serveru, na který má náš ISP co nejlepší konektivitu a aby náš packet putoval po Zemi, nikoli po satelitu. Třetí otázku, rychlosti přenosu dat si necháme na později, až si ukážeme VELMI zjednodušený příklad komunikce mezi hráči např. Quakea.

Komunikace v 3D hrách typu Quake probíhá na bázi klient-server. Aby si mohli hráči zahrát multiplayer on-line i po modemu, je třeba, aby průtok dat byl co nejmenší - tj. musí stačit prakticky kolem 4 KB/s. Je tak jasné, že objekty jako jsou skiny, textury, mapy, zvuky apod. musí být nainstalovány na straně klienta (hráče). Po samotném Internetu se již přenášejí jen ty nejdůležitější informace, jako jsou souřadnice ostatních hráčů, směr jejich pohledu, jaké drží zbraně, kdy kdo a čím vystřelil apod. Zkusme si tuto situaci představit. Připojíme se ke Quake serveru, nahrajeme si z disku mapu, všechny textury, skiny, zvuky aj. Připojíme se do hry, ve které je dejme tomu 20 dalších hráčů. Co je třeba přenést za data, abychom tyto hráče viděli, co dělají? Zcela určitě je třeba pro každého hráče přenést souřadnice X-Y-Z, kde se v mapě nalézá. Mapy jsou záměrně relativně malé, abychom mohli vystačit s co nejmenším počtem bitů pro popis souřadnice hráče. Např. pro osu X vystačíme s 2 byty, tj. 2^16=65536 pozic na souřadnici X. Pokud bychom brali vzdálenost dvou sousedících pozic na souřadnici X jako např. 1cm, můžeme si dovolit mít mapu o rozloze 65536 cm, tedy kolem 655metrů. Přesnost na 1 cm na osu je jistě dostačující. Pokud bychom použili k popisu osy X jen 1 byte, měla by naše mapa o rozloze 655metrů rozlišení pouhých 2.5metru! Je jasné, že pokud bychom použili k popisu souřadnice hráče na mapě jen 1 byte, viděli bychom hráče po mapě spíše skákat, než běhat. Proto ony 2 byty. Pozici hráče na mapě Quake ovšem určují souřadnice 3, tudíž musíme ony 2 byty násobit třemi. K popisu polohy hráče tak potřebujeme nutně 6 bytů. Ovšem jak víme, hráč se dále může rozhlížet všemi směry. K popisu horizontálního rozhlížení nám bohatě stačí 1 byte se svými 256 kombinacemi bitů, tj. 256 polohami kolem vertikální osy. Ovšem rozhlížet se můžeme nejen zleva doprava a obráceně, ale i seshora dolů a zdola nahoru. Pro popis vertikálního rozhlížení potřebujeme další 1 byte. Celkem tedy pro popis rozhlížení (kam zaměřuje kurzor zbraně hráče) potřebujeme 2 byty. Pro popis, jakou zbraň hráč drží je třeba přenést další 1 bajt (můžeme tak popsat až 256 zbraní). Pokud v mapě nějaký hráč vystřelí, je třeba přenést informaci o typu zbraně, z které bylo vystřeleno a čas od začátku hry, kdy hráč vystřelil. Popis zbraně, ze které bylo vystřeleno, obstará 1 byte, na čas potřebujeme alespoň 2 byty (65536 herních časových jednotek). Celkem tedy 3 bajty. Hráči rovněž skákají, proto je potřeba přenést další 2 byty, které popisují čas od začátku hry, kdy hráč vyskočil. Informaci o dopadu není nutno přenést, neboť to si již vypočítá z rovnice pomocí gravitace a rychlosti samotný klient. Další 2 byty padnou na oběť popisu případného "crouch" (opět čas od začátku hry). Pokud sečteme všechny bajty, vyjde nám 16 bytů, které kompletně popisují jednoho hráče na mapě spolu s informaci kdy a zda vystřelil. Pokud je hráčů v mapě 20, je třeba přenést oněch 16 bytů pro každého z nich, tj. 320 bytů. K této informaci o poloze všech hráčů na mapě je třeba připočíst 8 bytů na popis packetu (informace kam má packet jít, odkud jde a popis packetu). Dostáváme 328 bytů. Dále nějaké informace pro synchronizaci serveru apod., celkem tedy máme kolem 330 bytů/packet. Zde se dostáváme k otázce rychlosti přenosu dat od klienta na server a opačně. Pokud jsme připojeni k internetu přes 56Kbit modem k ISP prakticky rychlostí 48000 bps, přeneseme reálně za 1 sekundu 48000 / 10 = 4.8 KB. Spíše však kolem 4 KB. Pokud vydělíme ony 4 KB 330 bajty, které nám vyšly výše a obsahovali pozici všech hráčů na mapě v jediném okamžiku, dostáváme frekvenci obnovy informací o hráčích na mapě kolem 12 informací/s. Tedy dvanáctkrát za sekundu klient ví o situaci na mapě. Nic moc v porovnání s frame rate naší grafiky :-).

Pokud se však někdo připojuje jen s 33 kbit modemem, dostává jen 10 obnov/s! Pokud je někdo připojen na kabelu s rychlostí 50 KB/s, může mít až 150 obnov/s, což je již o něčem jiném, že? Je jasné, že na modemovém připojení vidíme hráče spíše poskakovat, než plynule běhat - jedinou možností jak toto eliminovat je interpolace na straně klienta. Po vysvětlení vlivu rychlosti přenosu dat na frekvenci obnovy informací o souřadnicích hráčů na mapě je třeba se zamyslet, jak hru ovlivní ping. Pokud by byl ping 0, uvidíme situaci přesně takovou, jaká na mapě je právě v okamžiku, kdy se díváme na monitor. Pokud máme však ping 300, znamená to, že vidíme souřadnice hráčů, které byli aktuální již před 0,3 vteřinou. Tj. vidíme v daném okamžiku to, co se již stalo před 0,3s, nikoliv v tomto okamžiku. Z toho pramení plno problémů - pokud my nyní máme zaměřeného hráče v zaměřovači a vystřelíme po něm railgunem, jak máme vědět, že ve chvíli, kdy po něm střílíme, je hráč opravdu na tomto místě a nikoliv jinde, kam by za těch 300 ms stihl uhnout! Je jasné, že takto by to nešlo - někdo musí rozhodnou, zda jsme ho opravdu střelili, či nikoliv - aby o tom rozhodl klient by bylo sice nejspravedlivější, ovšem museli bychom synchronizovat všechny hráče na mapě, což je nesmysl. Proto toto rozhoduje jen server. Pokud se na chvíli zamyslíme, jistě nás napadne plno dalších konfliktních situací, vyplývající z pingu. Pokud např. dojde k velké latenci u jednoho hráče, např. nekomunikuje se serverem třeba 10 sekund, server neví o jeho dalším pohybu a ví jen jeho poslední souřadnice. Proto ve hře nalezneme tohoto hráče, jak "běží na místě". Pokud server dostává od klienta informaci, ale jen třeba 2x za vteřinu, ostatní hráči by tohoto viděli běhat v podstatě v jakýchsi skocích, je tedy třeba jaksi předpovědět, kam asi hráč běží v době, kdy od něho server nemá informaci o jeho pohybu. Tato predikce se počítá např. z jeho minulých pohybů apod. Mistry na predikci jsou právě u ID Software, kde John Carmack dotáhl tuto neuvěřitelně složitou operaci právě u Q3 Arena téměř k dokonalosti, kdy se dá dobře hrát s pingem i kolem 500. Pro on-line hry je velmi důležité, aby ping příliš nekolísal. Je lepší stabilní ping 300, než kolísající ping 120-800...

Z výše uvedeného je snadné si domyslet, co se stane, pokud se nějaké packety cestou ztratí. Server či klient nedostává informaci a hráč se tak dostává do všem známého lagu.

Ještě jsem výše nastínil možnost komunikace přes TCP či UDP protokol. Pokud má hráč velké procento ztráty packetů s Quake serverem a pokud by komunikoval přes TCP, server by se stále snažil posílat ten samý packet, který by se stále ztrácel. Výsledkem by byl neuvěřitelně velký lag. Proto on-line hry využívají k přenosu právě protokol UDP, který nevyžaduje potvrzení přijetí . Pokud se některý z packetů ztratí, prostě se to server nedozví a posílá stále další. Je tak šance, že další packet, který nebohému hráči s vysokou procentní ztrátou packetů přijde není starý již 10-20 s, ale jen oněch 300 ms. Proto programátoři TCP opodstatněně zavrhují a hry jedou vesele přes UDP.

Výše uvedený model byl sice zjednodušený, ale podobný skutečnému přenosu např. v Quakeovi. Tento model byl typu klient-server. O modelu peer2peer si povíme někdy příště.

NEJČTENĚJŠÍ ČLÁNKY

Project NVRX: Grand Theft Auto 5 ještě nikdy nevypadalo lépe

Project NVRX: Grand Theft Auto 5 ještě…

Grand Theft Auto 5 dostává grafické modifikace takřka každý měsíc. Nyní máte před sebou špičku současné tvorby - Project NVRX.

4.  11.  2017 | | 10 N/A
Vybrali jsme nejlepší PC hry pod stromeček

Vybrali jsme nejlepší PC hry pod strom…

Toto je deset her, které byste rozhodně neměli při hraní na počítači vynechat.

včera | | 10 N/A
Need for Speed Payback: nedostatečně rychle a zběsile (recenze)

Need for Speed Payback: nedostatečně r…

Po menší přestávce jsme se konečně dočkali dalšího dílu série Need for Speed. Prospěla závodům pauza stejně, jako novému asasínovi? To se dozvíte z naší recenze.

12.  11.  2017 | | 17 N/A
Call of Duty: WWII - válka se nikdy nezmění (recenze)

Call of Duty: WWII - válka se nikdy ne…

Call of Duty se po dlouhé době opět vrací na domácí půdu, přitom se ale snaží zůstat moderní. Jak mu to vychází?

6.  11.  2017 | | 10 N/A
Městská akce Watch Dogs je na PC zdarma, stahujte!

Městská akce Watch Dogs je na PC zdarm…

Pokud jste ještě nedali prvním dílu této série šanci, nyní už nemáte žádný důvod akci nevyzkoušet.

7.  11.  2017 | | 2 N/A
Playstation trofeje začínají mít smysl, dostanete za ně kredity

Playstation trofeje začínají mít smysl…

Pokud patříte mezi lovce trofejí na konzoli Playstation, vaše snažení dost možná nabere výraznější obrysy.

6.  11.  2017 | | 10 N/A
Na PS Store startuje nová akce, najdete tam spoustu her pod tři stovky

Na PS Store startuje nová akce, najdet…

Chcete si doplnit svou digitální knihovničku konzole Playstation o pár parádních pecek? V obchodě máte skvělou akci.

16.  11.  2017 | | 4 N/A
Microsoft rozjíždí časově omezenou nabídku bundlů konzole Xbox One S

Microsoft rozjíždí časově omezenou nab…

Slevová mánie začíná.

12.  11.  2017 |