.[ ČeskéHry.cz ].
[Server - Client] Chůze
Jdi na stránku Předchozí  1, 2
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Sítě
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.

PříspěvekZaslal: 8. duben 2009, 14:07:10    Předmět: Odpovědět s citátem

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ů... Smile
_________________
Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sosarian



Založen: 07. 11. 2007
Příspěvky: 51

PříspěvekZaslal: 8. duben 2009, 17:15:48    Předmět: Odpovědět s citátem

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é Smile)

(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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Peta



Založen: 28. 07. 2007
Příspěvky: 154
Bydliště: V prvnim patre hned vedle koupelny.

PříspěvekZaslal: 8. duben 2009, 23:25:50    Předmět: Odpovědět s citátem

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á Smile
_________________
Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sosarian



Založen: 07. 11. 2007
Příspěvky: 51

PříspěvekZaslal: 8. duben 2009, 23:38:41    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 9. duben 2009, 01:16:26    Předmět: Odpovědět s citátem

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 Wink Protože jinak by to vypadalo opravdu úžasně, i kdyby jeden klient byl opožděn třeba jen o sekundu Cool
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 9. duben 2009, 06:33:05    Předmět: Odpovědět s citátem

A co teprve když by byl v jiném časovém pásmu Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 9. duben 2009, 07:28:35    Předmět: Odpovědět s citátem

Jj, "You have been killed! an hour ago" Wink
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 9. duben 2009, 07:37:58    Předmět: Odpovědět s citátem

Příp. "You will be killed tomorrow" Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Yossarian



Založen: 28. 07. 2007
Příspěvky: 274
Bydliště: Šalingrad

PříspěvekZaslal: 9. duben 2009, 08:38:07    Předmět: Odpovědět s citátem

Augi napsal:
A co teprve když by byl v jiném časovém pásmu Wink
DateTime.UtcNow? Razz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 9. duben 2009, 08:40:39    Předmět: Odpovědět s citátem

To já znám, ale Sosarian to nepoužívá Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Sosarian



Založen: 07. 11. 2007
Příspěvky: 51

PříspěvekZaslal: 9. duben 2009, 10:05:55    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Peta



Založen: 28. 07. 2007
Příspěvky: 154
Bydliště: V prvnim patre hned vedle koupelny.

PříspěvekZaslal: 9. duben 2009, 14:40:49    Předmět: Odpovědět s citátem

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

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Sosarian



Založen: 07. 11. 2007
Příspěvky: 51

PříspěvekZaslal: 9. duben 2009, 22:43:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Sítě Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna