Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Peta
Založen: 28. 07. 2007 Příspěvky: 154 Bydliště: V prvnim patre hned vedle koupelny.
|
Zaslal: 8. duben 2009, 14:07:10 Předmět: |
|
|
Sosarian napsal: |
jasne čas už si navzájem posílám (i když teda moc nevím kterej čas má mít hlavní slovo (jestli ten od klienta kterej se pohnul, nebo ten serveru) (zatím beru klienta) |
Určitě ber čas serveru, ne klienta. Nedovedu si představit co by se dělo kdybys synchronizoval čas na základě stovky připojených klientů... _________________ Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 8. duben 2009, 17:15:48 Předmět: |
|
|
2Mem: to snad nema duvod ne? jediny co tim ziskam je mozna odchylka od skutecneho casoveho posunu
kdyz mi klient s kazdym packetem posle cas a ja vsem klientum s kazdym packetem poslu cas (ten kdyz si klient mysli ze se pohl) (ted myslim jen packety o pohybu)
tak to vyjde na stejno
2Peta: no tak ja tu synchronizaci asi chapu nejak jinak,
klient K1 mě pošle:
teď je čas T1
a můj pohyb je P1
já si nastavím na serveru že se klient začal hýbat v čase T1, a v gettru pozice vracím skutečnou pozici + pohyb * (ČasTeď - T1 / 15 )
(15 ms je jeden cyklus v gameloopu)
všem klientum rozešlu že klient K1 se v čase T1 začal hýbat pohybem P1
tzn nejen že je na serveru to kde si ten klient myslí že skutečně je, ale je to i na všech ostatních klientech
(ale tu malé cukání které by to mělo způsobovat je při 300ms obrovské )
(ješte dodatek že jak z toho co sem napsal vyplíva nemám na serveru žádnou skutečnou smyčku updatujicí herní logiku v čase) |
|
Návrat nahoru |
|
|
Peta
Založen: 28. 07. 2007 Příspěvky: 154 Bydliště: V prvnim patre hned vedle koupelny.
|
Zaslal: 8. duben 2009, 23:25:50 Předmět: |
|
|
Sosarian napsal: |
2Peta: no tak ja tu synchronizaci asi chapu nejak jinak,
klient K1 mě pošle:
teď je čas T1
a můj pohyb je P1
já si nastavím na serveru že se klient začal hýbat v čase T1, a v gettru pozice vracím skutečnou pozici + pohyb * (ČasTeď - T1 / 15 )
(15 ms je jeden cyklus v gameloopu)
všem klientum rozešlu že klient K1 se v čase T1 začal hýbat pohybem P1
tzn nejen že je na serveru to kde si ten klient myslí že skutečně je, ale je to i na všech ostatních klientech |
Mě připadá že nad tím přemýšlíš jen stylem 1 server - 1 klient. Co se stane když to bude vypadat takhle (hypoteticky):
Klient1: čas 100 (před chvílí puštěný)
Klient2: čas 3000 (nějakou dobu běží)
Server: čas 15000 (běží dlouho)
K1: teď je čas 100 a můj pohyb je P1
Server: ok nastavuju si že klient se začal hýbat v čase 100, jeho pozice je P1*(vzorec). Posilam klientovi2 údaje: K1 je v čase 100 na pozici P1*(vzorec)
K2: ???
Problém vidím v tom, že K2 teď neví co si myslet o datech o K1, protože ten čas je pro něj dávno minulý - má to zahodit? Nebo předpokládat že pokračoval v pohybu po celou dobu a dopočítat to při stejném směru do času 3000?
Kdyby měli všichni klienti se serverem synchronizovaný čas rozdílný jen o nějaké stovky milisekund (běžná hodnota PINGu na server), tak tenhle problém pořešíš "snadno" právě přes tu interpolaci.
PS: mmo jsem nikdy nedělal tak se jen dohaduju jak se to dělá _________________ Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 8. duben 2009, 23:38:41 Předmět: |
|
|
K1 pošle zprávu serveru že je v čase T1 (v době posláni se T1 na klientovy rovnalo DateTime.Now) v pozici P1
server pošle K2 zprávu že klient K1 je v Čase T1 v pozici P1
klient K2 příjme zprávu že klient K1 je v čase T1 na pozici P1
čili ho posune na position + speed * (Now - T1)
takže ano, ten skok v tomhle případě bude součet latency mezi klientem K1 a serverem a klientem K2 a serverem
(mimochodem klientovy K1 se znovu nepošle zpráva kde ma být, takže sem to vždycky musel řešit pro dva klienty)
jenže já nemám jak předpokládat že klient přestal rotovat |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 9. duben 2009, 01:16:26 Předmět: |
|
|
Sosarian napsal: |
DateTime.Now |
Tohle máš doufám jako pseudokód (a ve skutečnosti tam máš sychnronizovaný čas podle postupu, který jsem ti podrobně popisoval) a ne skutečnou hodnotu času z operačního systému Protože jinak by to vypadalo opravdu úžasně, i kdyby jeden klient byl opožděn třeba jen o sekundu _________________
|
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 9. duben 2009, 06:33:05 Předmět: |
|
|
A co teprve když by byl v jiném časovém pásmu |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 9. duben 2009, 07:28:35 Předmět: |
|
|
Jj, "You have been killed! an hour ago" _________________
|
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 9. duben 2009, 07:37:58 Předmět: |
|
|
Příp. "You will be killed tomorrow" |
|
Návrat nahoru |
|
|
Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 9. duben 2009, 08:38:07 Předmět: |
|
|
Augi napsal: |
A co teprve když by byl v jiném časovém pásmu |
DateTime.UtcNow? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 9. duben 2009, 08:40:39 Předmět: |
|
|
To já znám, ale Sosarian to nepoužívá |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 9. duben 2009, 10:05:55 Předmět: |
|
|
nepouzim ani datetime.now ani utcnow (i kdyz ted to uz asi pouzivat budu)
kazdopadne to vsechno co pisete nijak neresi ten problem kterej sem popsal, nefunguje to jak ma ani na lokale (kdyz tam dam umelou latency)
2Mem: zkusim to klidne udelat jak rikas ty, i kdyz se tim dost omezim a kdyz se klientovy zmeni latecny tak to prestane uplne fungovat (leda ze bych to aktualizoval pri kazdym pohybovím packetu, ale to by pak bylo uplně to samí co dělám teď...) |
|
Návrat nahoru |
|
|
Peta
Založen: 28. 07. 2007 Příspěvky: 154 Bydliště: V prvnim patre hned vedle koupelny.
|
Zaslal: 9. duben 2009, 14:40:49 Předmět: |
|
|
Co se ti tu snazime vysvetlit je to, ze se musis synchronizovat a ten podle koho se synchronizuje je server. Tak ziskas nejaky zakladni kamen o ktery se muzes oprit, aneb "server ma vzdycky pravdu". Server je ten ktery mas pod kontrolou ty, klienta davas napospas hracum a kdyz budes mit v klientu bugu ktera zapricini, ze si najednou klient zacne myslet ze se umi teleportovat kam chce, tak server ho posle pekne do kytek, protoze to je nejakej radoby hacker. Navic server je zpravidla jeden (vnimany jako celek, jinak je to obecne treba login server, npc server a game server se vzajemnou skrytou komunikaci), kdezto klientu mas mraky. Co se tyce toho, ze se spozdeni meni, to je pravda. Taky se synchronizuje pravidelne a to i docela casto... nemuzes se spolehat na to ze hracovi vydrzi konstantni latence kdyz bude hrat 3 hodiny.
Trosku ale zabredavame do OT, protoze tu mame resit hlavne pohyb. Nicmene to ale podle me porad uzce souvisi a pokud si nevyresis takove zaklady jako je synchronizace a korektni sled udalosti, nemuzes pomyslet na pokracovani. Jde totiz o to, ze pokud na sebe hraci vystreli ve shodny okamzik a jeden padne o 3 sekundy pozdeji nez druhy a tak stihne jeste killnout tretiho, muze to vyvolat jiste emoce )
Ackoliv jsem nikdy MMO nedelal, nejake zkusenosti s upravovanim MMO serveru mam (lineage 2 server). Klonim se k nazoru ze model, kdy server obstarava drtivou vetsinu vypoctu (tj. pohyb postav, souboje, akce NPC atd) a klient pouze obstarava sbirani vstupu od hrace (cili pozadavky na server - chci jit tam a tam, chci koupit od NPC predmet X) a zobrazuje mu vysledy akci (ses mrtvej protoze si spadl do lavy...) je nejlepsi mozny. Maximalne muzes klientovi sverit nejake predzvejkani dat, jako ze mu rovnou spocte vektor pohybu a tak. Jinak server z pozadavku klienta odvodi odpoved, pripoji spozdeni ktere ma ziskane ze synchronizace a posle vysledek klientovi, ktery ho pouze zobrazi (tj resi plynulost animace a tak, kdyz je skok moc velky (velke latence) postava tam rovnou skoci... viz lagy v counterstriku nebo i jinych MMO her). Navic tenhle model ti silne omezi moznosti cheatovani na strane hracu a ver ze kdyz bude tvoje hra jen trosku vic hrana, hned se ti tam nejaci 14ti leti radoby hackeri objevi. _________________ Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 9. duben 2009, 22:43:08 Předmět: |
|
|
myslim ze wow si taky nechava od klienta posilat kde si klient mysli že je
asi tu synchronizaci teda tak predelam (myslím ze ve wow je to tak hlavně proto aby se nikdy nemusel nikam posunout ten hráč protože je někde jinde v klientovy a na serveru, ale za tu cenu že ho pak uvidí hůř ostatní hráči), ale jak sem psal tohle nevyresi ten problem kterej mam |
|
Návrat nahoru |
|
|
|