Ahoj, rozhodl jsme se si udělat v XNA síťovou RPG hru. Během nějaké doby se mi to podařilo - mám server, přes který komunikují klienti. Problém mám ale s latencí - to nevím, jak vyřešit. V lokální síti vše šlape jako hodinky - z 98% v reálném čase (ping 0-1ms). Pokud dám ale server na server s veřejnou IP adresou a hraje se přes internet (ping 28-32ms), je vše výrazně zpomalené. Zatím jsem to nějak neřešil, ale jednou budu chtít mezi hráči dělat třeba souboje a takhle to nepůjde...
Už jsem o tom přečetl hodně článků (převážně v angličtině) ale nikde to není pěkně vysvětlené. Potřeboval bych nějaký teoretický rozbor, jak udělat tu predikci (předvídání) - kód, nepotřebuji, naprogramuji si to sám. Potřebuji to akorát vysvětlit, jak to funguje.
Jak to mám třeba udělaný pohyb postav?
Klient na server odesílá 5x za sekundu, všechny vlastnosti svojí postavy (její souřadnice, otočení, atd..). Server tuto zprávu přijme a rozešle to všem hráčům. Ostatní klienti tuto zprávu přijmou a nastaví tyto parametry u daným objektům (hráčům). Narazil jsem tu ale na problém - tyto data nechodily plynule, a tak postavičky při chůzi lagovaly. Dal jsem tedy postavám ještě jedny souřadnice (virtuální) které ve skutečnosti odesílají (ne svou pozici) a po příchodu dat do cizího klienta se pak každá postavička snaží dohonit tyto své virtuální souřadnice - chodí tedy plynule, ale opožděně.
Jak mám pak řešit útoky? Kouzla? Ostatní to uvidí pozdě...
U kouzel mě napadlo to, že než postava kouzlo vyvolá (např.: letící ohnivou kouli) tak ihned odešle ostatním info, že kouzlo vyvolala a začne provádět tzv. casting (vyvolávání kouzla), což bude nějaký animovaný efekt - během kterého bude info o vyvolaném kouzle putovat do ostatních klientů. Po pár milisekundách to všem dorazí, a oni u sebe okamžitě zobrazí ohnivou letící kouli letící od mé postavy. V tu chvíli se u mě zastaví vyvolávání kouzla (casting) a já také vypustím tu kouli. Bude tedy u všech zobrazena zhruba ve stejný čas... Jiné řešení mě nenapadá....
Poradil by mi tedy někdo, jak toto funguje v jiných hrách? Jak mám spočítat tu latenci, aby se to u všech zobrazilo stejně?
Děkuji za jakékoliv postřehy a nápady.