Diskuze: MMO server

Člen

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Jak píšeš ty, udělal bych to na jednoduché tvary a pak zkoumal průnik mezi tvarem toho objektu a např. zdí. Důvod proč jednoduché tvary je jasný - k popsání kvádru ti stačí 2 souřadnice a k popsání koule souřadnice a poloměr.
Ber můj názor jako názor laika. 3D MMO jsem nikdy nedělal a ještě
dlouho dělat nebudu, ale dělal bych to tímto způsobem
Já bych to neřešil úplně tímhle stylem. Vzhledem k tomu že to má být MMO, je velká pravděpodobnost, že se najednou budou odesílat data tisíců lidí. Na to by jsi potřeboval NASA servery. Řešil bych to stylem - všechny kolize client, v případě nějaké nesrovnalosti přepočítat na serveru + po nějakém pravidelném intervalu třeba 10-15 minut to také překontrolovat na serveru. S jednoduchými tvary to nedává příliš smysl, vzhledem k tomu, že těžko tím vyřešíš nějaký problém typu: hacker prochází zdí.
Určitě udělat kolem hráčů válec, kontrola u klienta, a na serveru bych
prováděl kontrolu stejnou, ale ne každý tick, ale třeba každý desátý.
Pokud bude klient dobře fungovat a bez nějakých nechtěných modifikací, tak
se nemůže nic stát. Pokud se však hráč objeví někde, kam se nemůže
dostat a přijde na to server, tak bych ho buďto vrátil, nebo vyhodil
10-15 minut? k čemu to bude?
U klienta kontroluj kolize, na serveru jestli se uživatel nedostal kam neměl, pokud ano kickniho ze serveru.
V případě kontroly každá desátý tick bude objem dat tak enormní, že jenom náklady za servery by mnohonásobně převýšilo to, co si všichni na Devbooku za celý život vyděláme. Jednou za 10 minut +- to stačí vzhledem k tomu, že pokud je někdo hacker, hackovat bude v kuse i déle než 10 minut.
Jak ale potom zjistí, kupříkladu nocollide s objektem, který je na místě které je normálně dostupné?
Tak snad na server dá něco takového:
if (player.insertec(objekt) && !player.canGoTo(objekt)) {
// player je debil a nemá tu co dělat
// kickne playera
}
No dobře. Řekněme, že objekty bysme měli. Ale jak vyřešit terén..
Dokážeš si představit, kolik u toho server kódu bude nutné mít vypsaných objektů? Budou to tisíce aktivních objektů které bude muset s kolizí hráče porovnat. Na to by žádný současný server nestačil.
Vytřídění doslova statisíců objektů a jejich porovnání je nad síly jakéhokoli stroje. Natož pak člověka.
Vývojem jednoduššího MMO ( http://www.youtube.com/watch?… ) jsem se asi 3 roky při škole živil, tak sem zkusím něco málo zkušeností sepsat.
I když jsme dělali na hře pro 6.-7. třídu, tak se tam našel někdo, kdo dokázal posílat podvodné pakety a získat si tím spoustu peněz -> kontrola všeho musí být na straně serveru.
V rámci optimalizací je dobré dělat i kontrolu na straně klienta a případné nesmyslné nebo neproveditelné akce odfiltrovat už tam a ulevit tak serveru, ale právě kvůli podvrženým paketům, chybám apod. je nutné mít kontrolu i na serveru.
Měli jsme cizí fyzikální engine, takže se veškerý pohyb počítal na serveru - většinu času serveru pak žrala právě fyzika a to bylo vše dost zjednodušené - třeba stromy byly pro fyziku jen jako vysoký trojboký jehlan (-> větve se úplně ignorovaly), na klientovi se samozřejmě vykresloval normální strom.
U her typu WoW, kde není přesná fyzika, stačí pohyb hráče počítat na klientovi a na serveru jen kontrolovat, jestli tam hráč může být a jestli od minulé kontroly (obvykle 1x-několikrát za sekundu) kontrolovat, jestli se mohl dostat tam, kde je (podle hráčovy rychlosti apod.).
Vojtěch Pospíchal : při použití quadtree/octree pro tebe obvykle ani statisíce objektů na obří mapě nejsou problém.
Kolize s jednoduchým terénem (lze ho vyjádřit heightmapou) jsou úplně jednoduché, to můžeš řešit jako ve 2D.
V té 3D reprezentaci pak můžeš brát terén jako jednu entitu a zbylé entity jsou objekty a počítáš běžnou fyziku, objekty jsou reprezentovány zjednodušenou verzí, někdy se pro zjednodušení používá konvexní obálka.
A dokážeš si představit, jak obrovské servery by byli potřeba, pokud by to vaše MMO mělo hrát třeba byť "jen" 10K lidí? Tvorba MMO her je jeden z nejsložitějších úkonů herního vývojáře. Existují stovky řešení a žádné není ideální. Ale snažit se cheatery omezit pouze stranou serveru je prostě nesmysl. U malého projektu pro 100 lidí to možná může fungovat ale ve chvíli kdy to jde do tisíců je to nesmysl.
Pro takovéhle množství hráčů už těch serverů je většinou víc, např. u zmiňovaného WoW prý každý svět počítá jeden server.
Kontrolovat na serveru vše, co jde (a dává smysl to kontrolovat), většinou není až tak velký problém.
Nepřirovnávej to chvíli k WoW prosím. WoW je hra které má 22 milionů aktivních subscriberů. To jest +- 450? * 22 000 000 = 9900000000 korun ročně. S takovým příjmem by jsi si mohl koupit NASU celou ne a ne jenom jejich servery. Počítej normální průměrné MMOčko jako je třeba Guild Wars II. Jejich příjmy tak velké kvůli Pay to Play režimu nemůžou být, tj. musí šetřit na serverech. A čím se nejvíc ušetří? Ubráním kvality/ výpočetního výkonu, počtu serverů atd...! A to vše znamená zatěžovat servery co nejméně. Jinak by prostě vývojář s penězma nevyšel.
jist jenomže aby vyšel s penězma by musel kontroly omezit na minimum nebo je úplně vypnout.
Nebo by stačilo to dělat jen tak pro jistotu po deseti minutách. Nikdo z nás nechce v naší práci prodělávat. MMO hry nemají budoucnost právě kvůli takovýmto blbostem.
Jak by se řešil terén pro tento příklad (ve 3D si to doufám dokážeš
představit ). Pomocí té
výškové mapy by to asi nešlo.
Jen pro upřesnění - WoW vydělává cca pětinu z tebou uváděného množství ( - daně apod.).
Samozřejmě i Blizzard se snaží šetřit, co to jde, takže mají spoustu optimalizací a většinu toho, co jim WoW vydělá, využívají rozhodně jinak, než na provozování WoW serverů, drtivá většina jde na vývoj nových her.
Ony ty základní kontroly většinou nejsou příliš náročné, je to většinou jen jednoduché porovnání hodnot - jestli hráč opravdu má dost financí na nákup toho předmětu, na který klikl, jestli má dost many na vykouzlení toho spellu, případně jednoduché anticheaty, které se dají provozovat na serveru - proti speedhacku apod. (pokud fyziku hráče počítá klient - např. WoW).
I kdyby jsi tu pozici hráče ověřoval jednou za sekundu a na serveru měl 10k hráčů, tak jednou za sekundu provést 10 000 x pár jednoduchých výpočtů s vektory moc času nezabere.
Kontrola speedhacku po 10 minutách by moc smymsl neměla, hráč by to zapl třeba jen v místě, kde musí plnit quest a běhá pořád v jedné lokaci a po těch 10 minutách by jsi to nepoznal.
Buďto by to bylo jako ve WoW - kolize by řešil klient - pak výkon řešit
nemusíš.
A nebo na serveru by i tohle bylo možné řešit 2D mapou - 2D mapy se dají
používat i pro více vrstev nad sebou (samozřejmě pak má tvorba map
nějaké omezení - je nutné navrhnout systém tak, aby vyhovoval všem
požadavkům - když budu chtít složité 3D mapy, tak nepoužiju výškovou
mapu...).
Zobrazeno 23 zpráv z 23.