Tietopaketti rateista ja niiden säätämisestä.
Teksti on lainattu karhuton.com -sivustolta luvan kanssa, ja kaikki kiitos tästä hänelle! =)
Mitä "ratet" ovat?
Kun public-palvelimella joku warppii, eikä hänen pingissään ole mitään vikaa, niin hänellä on todennäköisesti ratet pielessä. CS:S:ssä on useita verkkoliikenteeseen liittyviä muuttujia, jotka vaikuttavat pelaamiseen. Tärkeimmät ovat: cl_updaterate, cl_cmdrate ja rate. Kun Sourcessa puhutaan "rateista", sillä tarkoitetaan muuttujia cl_updaterate ja cl_cmdrate. Ne ilmoitetaan muodossa: updaterate/cmdrate, esimerkiksi: 100/100 tai 66/66.
Rateilla määritetään kuinka monta kertaa sekunnissa paketteja vastaanotetaan (updetarate) ja lähetetään (cmdrate). Rate on kaistarajoitin, jolla vain rajoitetaan kuinka paljon kaistaa peli voi käyttää. Suomessa kaikilla on ainakin 512k-yhteydet, joten yhteydet eivät useinkaan rajoita rateja, mutta pelaajien koneiden tehot ovat monella huonot, joten ratet pitää laskea FPS:n mukaan (toisin kuin CS 1.6:ssa!).
FPS ja choke
Yksinkertaisesti sanottuna pelin raskaimmat osa-alueet ovat grafiikka, fysiikka ja äänet. Näistä huolehtii näytönohjain, prosessori ja äänikortti. Mitä parempi äänikortti ja näytönohjain, sitä vähemmän prosessorin tarvitsee "auttaa" niitä. Pelin FPS riippuu pääasiassa näytönohjaimesta ja prosessorista. Jos näytönohjain on nopeampi tekemään työnsä kuin prosessori, riippuu pelin FPS prosessorista. Jos taas prosessori tekee työnsä nopeammin kuin näytönohjain, riippuu FPS siitä. Source-moottori on hyvin raskas prosessorille, joten useimmilla prosessori on pullonkaula - ei näytönohjain (jos FPS-konffit on asennettu, millä näytönohjaimelle raskaita efektejä yms. on karsittu).
Kun FPS riippuu prosessorista ja se putoaa alemmaksi kuin cmdrate, alkaa peli chokeamaan: paketteja pitäisi lähettää nopeammin kuin prosessori pystyy (se vielä käsittelee grafiikka- ja fysiikkamoottoreita). Jos FPS putoaa näytönohjaimen takia, ei chokea synny (prosessori ehtii käsitellä paketit sillä aikaa, kun se odottaa näytönohjainta). Peli voi myös choketa, kun updaterate on suurempi kuin FPS (paketteja vastaanotetaan liian nopeasti).
Kun peli chokeaa, viivästyy pakettien vastaanottaminen tai lähettäminen. Tämä aiheuttaa sen, että pelaajat eivät olekaan ruudulla enää siinä kohdassa missä pitäisi tai ammukset eivät lähdekään piipusta heti kun painat nappia. Tämän huomaa hyvin tilanteissa, missä joku juoksee lähellä sinua kohti ja ammut kohti sarjaa nappi pohjassa. Kuitenkin kuolet ja näet konsolista, että et osunut häneen kertaakaan! Heti kuollessa voi nähdä kuinka net_graphissa choke on korkea ja ampumistapahtuma ei koskaan ehtinyt serverille (vaikka omalla ruudullasi ase ampuu).
Liike, interpolointi ja extrapolointi
Tiivistetysti:
Jokainen pelaaja lähettää oman modellinsa asennon ja sijainnin monta kertaa sekunnissa (cl_cmdrate). Jokainen pelaaja pyytää palvelimelta muiden pelaajien sijainnit myös monta kertaa sekunnissa (cl_updaterate). Interpolointi laskee jokaiselle modellille liikeradan kahden päivitetyn paikan välillä, jotta näytöllä modellit näyttäisivät liikkuvan pehmeästi, eikä hypähdellen päivitetystä paikasta toiseen (warppien). Jos paikkatietojen saanti viivästyy, peli yrittä laskea (cl_extrapolate ja cl_extrapolate_amount) miten modelli liikkuisi - vaikka se ei tiedä mihin kyseinen pelaaja on liikkunut. Kun paikkatieto sitten saadaan myöhässä ja arvaus meni hieman pieleen, peli siirtää modellin arvatusta sijainnista modellin oikeaan kohtaan. Tämä siirto kestää cl_smoothtime-muuttujan määrittämän ajan, joka tietenkin kannattaa pitää mahdollisimman lyhyenä (0.01). Jos cl_smooth on 0, siirtymisanimaatiota ei pehmennetä ja peli näyttää "nykivältä".
Muuttuja cl_interp määrittää, kuinka kauan odotetaan paketteja (esim. cl_interp 0.02 tarkoittaa, että odotetaan 20ms). Tämä on myös se viive, mikä jokaisen pelaajan näytön tapahtumissa ja pelimoottorin tapahtumissa on. Ennen tämän muuttujan arvoa sai muuttaa itse, mutta nykyisin peli laskee sen muuttujan cl_interp_ratio avulla (kts. Muutoksia). Mahdollisimman pieni viive on parempi, mutta liian pieni voi aiheuttaa extrapolointia! Updateratella määritetään kuinka monta kertaa sekunnissa paketteja vastaanotetaan, eli kuinka usein päivityksiä palvelin pelaajalle lähettää (esim. cl_updaterate 50 tarkoittaa, että päivitysten välillä kestää 20ms - se lasketaan kaavalla: 1 s / 50 = 0.02 s = 20 ms). Cl_interp pitää olla yhtäsuuri tai suurempi kuin tuo arvo. Koska peli laskee sen automaattisesti, ei siitä enää tarvitse itse huolehtia! Jos muutat updateratea, peli muuttaa cl_interp arvon sopivaksi.
Tickrate
Palvelimen tickrate on myös pelaajan tickrate. Updaterate on pienempi tai yhtäsuuri kuin tickrate. Jos pelaat tickrate 66 palvelimella, ei ratet 100/100 ole käytössä, koska ne ovat oikeasti 66/66 (näkee net_graph 3:sta). Jos koneesi FPS on pienempi kuin palvelimen haluama tickrate, oman koneesi tickrate putoaa FPS:n tasolle. Eli koneesi tickrate on pienempi tai yhtäsuuri kuin FPS ja palvelimen tickrate.
Ennen tammikuun 2007 päivitystä tämä aiheutti pelaajille ongelmia, koska heidän cl_interp arvonsa oli liian pieni tälläiselle tickratelle (ja updateratelle), kun oli ratet 100/100/0.01 käytössä. Jos updaterate on tickraten takia pakotettu 66 eikä 100, niin interp pitää olla 1 / 66, eli 0.018 - eikä 0.01. (Päivityksen jälkeen tämä ei ole enää ongelma.)
Kun oman koneen tickrate on FPS:n takia pienempi kuin palvelin haluaa, myös cmdrate putoaa (cmdrate on yhtäsuuri tai pienempi kuin koneesi tickrate).
Jotkin palvelimet käyttävät zBlockia tai CVAR-X:ää cmdraten pakottamiseen (usein arvoksi 100), jotta palvelimella ei voisi "rate-huijata" ja kaikki lähettäisivät sijaintinsa paketeissa mahdollisimman nopeasti (tarkempi osuminen). Kuitenkin kaikki pelaajat, joilla FPS on pienempi kuin 100, cmdrate putoaa väkisin tickraten takia alle 100:ksi. Tästä aiheutuu chokea kyseiselle pelaajalle ja muut eivät edelleenkään saa päivityksiä sen nopeampaa kuin kyseisen pelaajan koneella on mahdollista.
Tämä aiheuttaa sen, että "huonolla" koneella pelaavat (FPS ja tickrate alle 100) eivät voi pelata kunnolla tälläisillä zBlock-palvelimilla, eikä muutkaan pelaajat hyödy yhden pelaajan chokeamisesta.
Fiksuinta olisi rajoittaa palvelimelta asetukset näin:
cl_interpolate: 1
cl_interp_ratio: 1.0 - 2.0
cl_updaterate: 33 - 100
cl_cmdrate: 33 - 100
Jopa heikommilla koneilla ja yhteyksillä pelaavat pystyvät täten pelaamaan palvelimella ja silti minimiarvot eivät aiheuta liiallista warppimista.
Näin lasket itsellesi hyvät ratet
Koska Source-moottori on prosessorille raskas, voi liian korkeat ratet aiheuttaa chokeamista. Sopivat arvot määritellään tickraten, eli FPS:n mukaisesti koneellesi sopivaksi.
Jos sinulla ei chokea vaikka cmdrate on korkeampi kuin FPS (eli tickratea ei rajoita pelin FPS), on prosessorisi nopeampi kuin näytönohjain. Kokeile korkeampia updaterate- ja cmdrate-arvoja, kunnes tulee vastaan maksimiarvot 100/100 tai peli alkaa chokeamaan. Jos peli chokeaa vain raskailla mapeilla tai "ruuhkatilanteissa" (paljon pelaajamodelleja edessäsi), niin pudota rateja vielä hieman alemmaksi.
Jos yhteytesi on hyvin hidas (ISDN tai ADSL 256k), ratet pitää laskea nettiyhteyden nopeuden mukaan. Tässä tapauksessa Sourcen oletusasetukset sopivat silloin kohdallasi hyvin (eli 30/20). Nämä oletusasetukset toimivat myös, jos koneesi FPS on alle 33!
Updaterate voi ja kannattaakin olla korkeampi kuin cmdrate, mutta jos chokeamista tapahtuu enemmän, kannattaa sitä pitää samassa arvossa kuin cmdrate.
Esimerkki:
Minulla on pelissä vain harvoin FPS alle 50, joten käytän arvoa '50' rateissa:
cl_updaterate 50
cl_cmdrate 50
Jos ns. mikrowarppimista tai chokea esiintyy huonon yhteyden takia, voit nostaa cl_interp_ratiota hieman ylöspäin oletusarvosta (kuten 1.0 -> 1.1). Selityksen cl_interp_ratio-muuttujaan vaikutuksesta voit lukea aiemmasta kappaleesta Muutoksia. Liian suuri cl_interp_ratio-arvo aiheuttaa viiveongelmia, koska cl_interp on silloin liian suuri! Suosittelenkin, että cl_interp_ratio ei ylittäisi arvoa 2.0!
rate 30000
Jos sinulla on 512k tai nopeampi yhteys, on 30000 enemmän kuin tarpeeksi. Suurempiakin arvoja voi käyttää, mutta sillä ei ole merkitystä. Hitaille yhteyksille, kuten 128k ISDN-käyttäjille '12000' ja 256k ADSL-käyttäjille '20000'.
Net_graph 3:lla näkee käytössä olevan updateraten (In-rivin viimeinen arvo: nnn/s). Out-rivillä näkyy käytössä oleva cmdrate.
Vääriä käsityksiä:
- Oletusratet ovat hyvät. Ei niitä kannata muuttaa.
Oletusratet on 30/20 ja siten cl_interp 0.1. Sinulla on sis 100ms viive näytön tapahtumissa, paikkasi päivitetään vain 50ms välein ja muiden sijainti päivittyy vain 33ms välein. Mitä nopeammin sijainti päivitetään, sitä vähemmän tapahtuu "läpiampumista". Ratejen muuttaminen hyödyttää SINUA ja muita.
- Ratet 101/101 ja rate 25000 kaikille!
Palvelimella tickrate on parhaimmillaan 100, joten silloin sinun updaterate ja cmdrate ovat myös enintään 100 (eikä 101). Kun FPS putoaa alle 100, niin cmdrate (ja mahdollisesti updaterate) putoaa myöskin. Peli alkaa chokeamaan ja ampuminen ja liikkeenmuutokset palvelimelle myöhästyvät (ampumisesta tulee lottoa).
Eli tiivistettynä: kaikille 25000/100/100 -ratet eivät ole parhaat, mutta eivät nuo oletusratetkaan yleensä ole oikein.
