IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: MMO server

Aktivity
Avatar
Neaktivní uživatel:25.12.2013 4:28

Zdravím, zajímalo by mě, jak se řeší kontrola kolize, nalezení cesty atd. v online hrách, především tedy ve 3D MMORPG. Co jsem nad tím tak přemýšlel, tak jsem dospěl k tomu, že kolize je dobré řešit u klienta i na serveru (kvůli cheatování), jenže jak je to řešené. Ve 2D je to celkem jasné (server jednoduše načte mapu), ale ve 3D mi to přijde docela velká zátěž na server. Napadlo mě, že by se z mapy vyexportovaly jednoduché tvary (kvádr, válec) pro všechny objekty a poté se to nějak počítalo. Na serveru by nebylo třeba počítat přesné kolize, jen taková kontrola proti těm cheatrům. Není mi ale zase jasné, jak by se to udělalo s terénem. Vzájemné kolize hráčů a NPC bych taky nepočítal. Jak byste to udělali vy?

Odpovědět
25.12.2013 4:28
Neaktivní uživatelský účet
Avatar
mnauik
Člen
Avatar
Odpovídá na Neaktivní uživatel
mnauik:25.12.2013 11:27

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 :)

Nahoru Odpovědět
25.12.2013 11:27
minusuj mě, ale zdůvodni to ;)
Avatar
Vojtěch Pospíchal:25.12.2013 11:49

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í.

 
Nahoru Odpovědět
25.12.2013 11:49
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:25.12.2013 11:51

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 :)

Nahoru Odpovědět
25.12.2013 11:51
Neaktivní uživatelský účet
Avatar
Odpovídá na Vojtěch Pospíchal
Neaktivní uživatel:25.12.2013 11:52

10-15 minut? k čemu to bude?

Editováno 25.12.2013 11:55
Nahoru Odpovědět
25.12.2013 11:52
Neaktivní uživatelský účet
Avatar
Michal Žůrek - misaz:25.12.2013 11:57

U klienta kontroluj kolize, na serveru jestli se uživatel nedostal kam neměl, pokud ano kickniho ze serveru.

 
Nahoru Odpovědět
25.12.2013 11:57
Avatar
Odpovídá na Neaktivní uživatel
Vojtěch Pospíchal:25.12.2013 12:05

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.

 
Nahoru Odpovědět
25.12.2013 12:05
Avatar
Odpovídá na Michal Žůrek - misaz
Vojtěch Pospíchal:25.12.2013 12:07

Jak ale potom zjistí, kupříkladu nocollide s objektem, který je na místě které je normálně dostupné?

 
Nahoru Odpovědět
25.12.2013 12:07
Avatar
Odpovídá na Vojtěch Pospíchal
Neaktivní uživatel:25.12.2013 12:11

No jasný, to bude asi blbost :)

Nahoru Odpovědět
25.12.2013 12:11
Neaktivní uživatelský účet
Avatar
Odpovídá na Vojtěch Pospíchal
Michal Žůrek - misaz:25.12.2013 12:30

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
}
Editováno 25.12.2013 12:31
 
Nahoru Odpovědět
25.12.2013 12:30
Avatar
Neaktivní uživatel:25.12.2013 13:25

No dobře. Řekněme, že objekty bysme měli. Ale jak vyřešit terén..

Nahoru Odpovědět
25.12.2013 13:25
Neaktivní uživatelský účet
Avatar
Odpovídá na Michal Žůrek - misaz
Vojtěch Pospíchal:25.12.2013 14:02

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.

 
Nahoru Odpovědět
25.12.2013 14:02
Avatar
Odpovídá na Vojtěch Pospíchal
Michal Žůrek - misaz:25.12.2013 14:13

Tak si je vytřídí.

 
Nahoru Odpovědět
25.12.2013 14:13
Avatar
Odpovídá na Michal Žůrek - misaz
Vojtěch Pospíchal:25.12.2013 15:34

Vytřídění doslova statisíců objektů a jejich porovnání je nad síly jakéhokoli stroje. Natož pak člověka.

 
Nahoru Odpovědět
25.12.2013 15:34
Avatar
Luboš Běhounek Satik:25.12.2013 17:07

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.

Nahoru Odpovědět
25.12.2013 17:07
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Vojtěch Pospíchal:25.12.2013 17:26

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.

 
Nahoru Odpovědět
25.12.2013 17:26
Avatar
Odpovídá na Vojtěch Pospíchal
Luboš Běhounek Satik:25.12.2013 18:50

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.

Nahoru Odpovědět
25.12.2013 18:50
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Vojtěch Pospíchal:25.12.2013 19:11

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.

 
Nahoru Odpovědět
25.12.2013 19:11
Avatar
Odpovídá na Vojtěch Pospíchal
Michal Žůrek - misaz:25.12.2013 20:03

jist jenomže aby vyšel s penězma by musel kontroly omezit na minimum nebo je úplně vypnout.

 
Nahoru Odpovědět
25.12.2013 20:03
Avatar
Odpovídá na Michal Žůrek - misaz
Vojtěch Pospíchal:25.12.2013 20:34

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.

 
Nahoru Odpovědět
25.12.2013 20:34
Avatar
Odpovídá na Luboš Běhounek Satik
Neaktivní uživatel:25.12.2013 20:39

Jak by se řešil terén pro tento příklad (ve 3D si to doufám dokážeš představit :D ). Pomocí té výškové mapy by to asi nešlo.

Nahoru Odpovědět
25.12.2013 20:39
Neaktivní uživatelský účet
Avatar
Odpovídá na Vojtěch Pospíchal
Luboš Běhounek Satik:26.12.2013 17:46

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.

Nahoru Odpovědět
26.12.2013 17:46
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Neaktivní uživatel
Luboš Běhounek Satik:26.12.2013 17:50

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...).

Nahoru Odpovědět
26.12.2013 17:50
https://www.facebook.com/peasantsandcastles/
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.