Blog Challenge : Hogyan leszel alfahím

Amikor a tabella élén végzel, az egódat simogatja a K/D ratio. Amikor addig vered az ellent, hogy az ragequit-el és odaszúr egy kellemes üzenetet, királynak érzed magad. Amikor az utolsó kanyar előtt előzöd le lógó futőművel az elsőt...

   Mindenkiben él a versenyszellem, természetes férfiösztön és talán a legkényelmesebb módja eme ösztön kielégítésére a videójátékok multiplayer módjának kipróbálása. Az első videójátékot is csak egy másik ember ellen lehetett játszani (Tennis for Two, 1958), napjainkban meg már az a ritka, ha valamiből hiányzik a többjátékos mód. Most felsorolhatnám milyen játéktípusok léteznek, hogy van offline multiplayer, ami lehet split screen-en vagy teljes képernyőn ésatöbbi de az nem én lennék. Szóval emberek, nyissuk fel motorháztetőt és nézzük meg mi történik miközben mi anyázunk az irreális helyzetben bekapott fejlövés miatt!

 

Kivégzés

 

Két fajta hostingot szoktak emlegetni, peer2peer illetve server/client alapút. Engedjétek meg, hogy az ezek közti különbséget most ne írjam le. Aki nem jön rá a nevükből, az ne játszon inkább. Én a server/client-ről fogok most bővebben írni, méghozzá a source motor működéséről, de az alábbi elv ráhúzható szinte minden motorra, hisz nagyon újat nem lehet ebben a témában alkotni.

   Adva van egy server, fut mondjuk rajta egy CS:GO/Titanfall/Team Fortress 2. Ugrálnak, lövöldöznek egymásra a játékosok. Ezeket a mozdulatokat, lövéseket, golyókat, státuszokat amiket a játékosok küldenek a kiszolgáló felé a host szabályos időközönként (tick-enként) feldolgozza, majd szimulálja a játékosok helyzetét, státuszát, a map objektumait, szabályokat. Source esetében az egyes tick-ek között eltelt idő 15ms, tehát 66.666…. tick-et szimulálunk másodpercenként (ebből könnyedén ki lehet következtetni, hogy 60 FPS-nél több nem igazán kell egy multi játék futtatásához, de a valóság ennél ridegebb). Minden szimuláció után a szerver dönt, hogy mely klienseknek küldje el az aktuális pillanatképet (snapshot-ot).

Tick-ek és Snapshotok

 

A tickrate, azaz hogy milyen sűrűn szimuláljon, változtatható de erősen hat a CPU és sávszél terhelésre. A játékosok általában limitált sávszélességgel rendelkeznek és ha egy server több snapshot-ot küld, mint amit a kliens be tud fogadni, akkor adatvesztés lép fel, ilyenkor ugrálhat a játék szemünk előtt, lag-olunk. Ezért a kliens megad egy a sávszélességéről szóló adatot (rate), ami alapján a szerver el tudja dönteni, milyen sűrűséggel küldhet snapshot-okat a kliensnek. Azt hinnénk, hogy amennyiben a szerverünk észlelei, hogy mi 50 Mbit-es hálózaton csücsülünk, akkor kitolja az összes lehetséges snapshot-ot, de nem. Soha nem küld többet a kliensen beállított snapshot frissítési rátánál, ami source-ban például 20 pillanatkép másodpercenként (ez változtatható a cl_updaterate paranccsal) és persze soha nem küld többet a szimulált tick-eknél másodpercenként. Amennyiben ezeket valaki módosítgatná játékos oldalról, azt még a szerverünk simán felülírhatja a saját beállításaival.

   Játékosunk a beviteli eszközével/eszközeivel parancsokat generál. A mintavételezés sebessége egyenértékű a kiszolgáló tickrate-jével, azaz 15ms-enként mintavételez a játék. Egy beviteli parancs valójában a leütött billentyű és az egér, vagy a kontroller aktuális állapota, tehát egy snapshot. Nem küldi külön-külön az aktuális parancsokat játékunk, hanem beviteli eszközeink aktuális állását, csomagok formájában. Ez természetesen nem lehet több a host tickrate-jénél. Általában harmincszor küld a játék csomagot a szerver irányába, de persze ez a ráta is változtatható.

   Ahhoz, hogy csökkentsük a hálózati terhelést, az adatokat tömöríteni kell. Ez azt jelenti, nem mindig kapunk egy teljes snapshot-ot a játék aktuális állásáról, csak az aktuális frissítéseket kapjuk meg. Teljes képet csomag (packet) formájában csak akkor kap a játékos, amikor indul a játék, illetve ha szerencsétlen súlyos csomagvesztés áldozata lesz (például ha egy másodpercre elmegy a hálózati kapcsolatunk a szerver felé).

 

Egy jól feldolgozott parancs

 

   A válaszidő, azaz a ping, az az eltelt idő ami alatt a játékos elküldi a parancsait a szervernek, az feldolgozza és visszaküldje az eredményt. Ergo pl egy ugrás, onnantól hogy a számítógépünk vagy konzolunk elküldte a csomagot (az ezalatt eltelt időt packet latency-nek hívjuk), hogy ugrunk, addig, míg a szerver vissza nem küldi, hogy szerinte is ugrunk. Ha ez 30 ms alatt történik meg már nagyon örülhetünk. A pingünk nem csak a hálózati kapcsolatunktól függ, függ a szerver paraméterezésétől, a processzorától.

   Fentebb írtam, hogy a kliens csak 20 snapshot-ot kap a szervertől másodpercenként. Magyarul, ha csak ezeket a snapshot-okat renderelnénk, lenne kemény 20 FPS-ünk, ezt még meg lehetne fejelni pár eldobott hálózati csomaggal, ami ugyancsak hibákat okozna. Ezt interpolálással hidalják át (Client View Interpolation). Ha egy kliens 20 pillanatképet kap másodpercenként azaz 50ms-enként kap újat, akkor a kliens idejét előrébb hozzuk a szerverhez képest szintén 50 ms-el áthidalhatjuk azt a kieső időt, amikor nem érkezik adat, így nem lesz darabos a játék. Sajnos ez konstans 100 milliszekundumos késést okoz a játékban megjelenítés tekintetében, de ezt a lagot a szerverünk kompenzálja, ezért nem kell mindent egy tizedmásodperccel előbb csinálnunk, mint szeretnénk.

Client view interpolation

 

   Az időutazásnak nincs még itt vége. Képzeljük el, hogy egy játékosnak 150-es pingje van, elindul előre az ellenfél felé, de észleli, hogy ez nem azonnal történik, hiszen a szervertől csak 0.15 másodperc múlva jön vissza a feldolgozott parancs, természetellenes érzéssel töltve el a játékost, elvégre minden később történik. Ezért ahelyett, hogy megvárná míg a szerver parancsát a kliens, megtippeli hogy az adott beviteli parancs után mi fog történni a játékban (Input Prediction)és később szinkronizálja a szerver által küldött adatokkal. Amennyiben a kliens tévedett, azonnal korrigálja az adatokat a szervertől kapott adatokkal, ez általában olyan gyorsan történik, hogy észre sem vesszük a játék hevében és persze minimális a hatása. Leginkább egyszerre lövéseknél jöhet elő, amikor mi bukjuk a helyzetet, de úgy éreztük előbb lőttünk. Ha van olyan szerencsénk, és még killcam is van, akkor láthatjuk azt ami a szerveren történt valójában és vágjuk ki az ablakon dühünkben az egész hóbelevancot.

   De nem kell elkeseredni, egy mai modern játékban a szerver kompenzálja a lagot. Mégpedig úgy, hogy az időbélyeggel ellátott adatot elemzi a szerver és összeveti a saját pillanatképeivel, az időbélyeg alapján. Tehát ha egy játékos a kliens ideje szerint 10.5-kor lő egyet, akkor ez a parancs becsomagolásra kerül és repül a szerverhez. Miközben a csomag utazik, telik az idő és a szerver is szimulálja a világot. A csomag megérkezik a szerver ideje szerint 10.6 -kor és nem detektálta a lövést, hisz az ő ideje szerint az meg sem történt, és hiába céloztunk fejre és húztuk a ravaszt, nem történik semmi. Ezért tárolja a lag kompenzáló algoritmus 1 másodpercig az összes játékos helyzetét, hogy korrigálhassa az időbélyegek alapján az ilyen kimaradt utasításokat az alábbi képlet alapján:

Beviteli parancs ideje = Aktuális szerveridő - Packet Latency - Client View Interpolation

Ezekből az apró technikai trükkökből kiderül, hogy a multiplayer játékunk soha az életben nem lesz egy pixelpontos történet, soha nem azon az ezredmásodpercen fog múlni a fejlövés, ahogy azt elképzeltük, hanem inkább az időszinkronizáción és a szerver korrekciós algoritmusain. És igen, a fentiek alkotják azt a konyhanyelven netkódnak nevezett valamit, amit nagy gamer-ek annyira szeretnek fikázni, vagy dícsérni.

 

Amit érdemes leszögezni:

- Hálózaton történő játékban nem az történik frame-re pontosan, amit te valójában a kliens oldalon csinálsz, ez a legnagyobb hátránya. Sokaknál ledobja a szíjat a gép odafenn, ha pillanatnyi anomáliákat tapasztal, de hiddjétek el, semmi értelme dühöngeni.

- A netkód megegyezik kliens és szerver oldalon is, ugyanaz a motor dolgozik mindkét oldalon csak a szerepkörök és ezáltal beállítások változnak.

- A mai modern száloptikás internetes elérésekkel (pl Budapesten) meg se érzed ha letöltesz vagy streamet nézel online játék mellett, hisz az igényelt sávszélesség elég alacsony a kicsi csomagméretek miatt. Arra az egyre érdemes figyelni, hogy 1-2 mbit sávszélesség mindig maradjon.

- Verekedős játékot max casual szinten érdemes online játszani, hisz ha valahol számít az idő, akkor ez a műfaj az. Ha komolyan akarsz játszani, keress egy offline partnert.

   Amennyiben tanulságosnak ítélted az fentieket, nyomj fent egy lájkot. És mivel ez az írás a Blog Challenge-nek keretei közt született meg, köszönjétek godach-nak, hogy kihívott. Az én kihívottam : …. Nemsokára kiderül…

... Szóval az én kihívottam, még mindig nem találtam ki, csak a témát. Ami a fentihez hasonlóan igényel némi utánajárást. Játszunk olyat, hogy jelentkeztek. Ha lesz önkéntes,  akkor elárulom a témát.

32 komment - szólj hozzá!

Nem sietik el a Valheim frissítéseit

A vártnál lényegesen lassabban érkeznek a vikinges túlélőjáték tartalmi frissítései, de némi reménysugár gyanánt az Iron Gate Studio elárult egy-két részletet a Heart & Home névre keresztelt csomagról.

Multiplayer játékon dolgozik a Naughty Dog

Számos pletykát hallottunk arról, hogy a Naughty Dog csapata utólagosan elkészítené a The Last of Us: Part II többjátékos módját, a legfrissebb álláshirdetések azonban egy teljesen önálló online játék érkezésére utalnak.

E3 2021: Íme, a Redfall, az Arkane Studios új játéka

Egy vadonatúj játék leleplezésével zárta az Xbox és a Bethesda közös E3-as műsorát az Arkane Studios. A csapat egy vámpíros, Left 4 Dead stílusú shooteren dolgozik, amiből csak úgy árad a 80-as évek hangulata.

Magyarázós előzetesen a Scarlet Nexus

A Bandai Namco egy kiadós, bő nyolcperces előzetessel készít fel bennünket a Scarlet Nexus érkezésére. A játékmenettel telezűtdelt videó során megismerhetjük a játék világát, annak hőseit és a bizarr ellenfeleinket.

Újabb előzetesen a Bright Memory: Infinite

A Bright Memory: Infinite ismét megmutatta magát egy újabb gameplay-előzetes kíséretében. Akcióból bizonyosan nem lesz hiány, ami a mozgóképes kedvcsináló tanúsága alapján piszkosul látványosnak ígérkezik.

Palworld - Pokémon, csak puskákkal

Próbáljátok elképzelni, mi hiányzott eddig a Pokémon-játékokból! Ha mindig is arra vágytatok, hogy rabszolgamunkára fogjátok a kis zsebszörnyeket, élő pajzsként használjátok őket, vagy fegyverrel menjetek nekik, a Palworld épp nektek való lesz.

Forest Whitaker is visszatér a Star Wars: Andorban?

A jelek szerint újabb ismerős arc bukkanhat majd fel a Disney Plusra készülő Star Wars: Andorban, hiszen állítólag az a Forest Whitaker is szerepet kapott a sorozatban, aki Saw Gerrerát alakította a Rogue One-ban.

Az utolsó órákban is szivárog az új Battlefield

Ma délután végre lelepleződik a következő Battlefield-játék, melynek szivárgásai az utolsó órákban sem hagynak alább. Ezúttal egy csokor hivatalos kép és a játék borítója került ki idő előtt.

Lelövik a Fallout 76 battle royale-módját

Érdeklődés hiányában lelövik a Fallout 76 battle royale-módját, a Nuclear Wintert. A játékosok jutalmat kapnak kárpótlásul, miközben a Bethesdánál új opciókat térképeznek fel a PvP-re.

E3 2021: Megvan a 12 Minutes megjelenési dátuma

Egy időhurokba ragadva kell elkerülnünk a tragédiát a 12 Minutesben, amelyhez igazi sztárok kölcsönzik a hangjukat. Az Xbox és a Bethesda műsorában kiderült, mennyit kell még várnunk erre az interaktív thrillerre.