Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 12. duben 2011, 18:39:29 Předmět: Multiplayer, vyrovnávání lagů |
|
|
Zdar,
problém je následující, když jsou pingy na server větší než nejakejch 40ms, tak mi začne hráč(kužel ve videu) lagovat, zkoušel jsem interpolovat tak jako při klasickejch animacích - to nemělo výsledek, momentálně mi if.then poradil extrapolaci - snažím se dopočítat pozice ale jak je vidět ve videu http://www.youtube.com/watch?v=n1NtSPkVo8g tak prostě to nefunguje ani kdybych se pokakal.
Tímdle dopočítávám pozice, myslím že je to správně ale prostě to nefunguje xD
kód: |
vec2 angle = netw.playerPositions[i].angle; //- uhel kam se diva hrac
vec3 pos = netw.playerPositions[i].pos; // - jeho AKTUALNI pozice co mi dosla v paketu
//i - index hrace kteryho kreslim, to je snad pochopitelny
vec3 inPos = pos;
if(netw.playerPositions[i].isMoving)
{
float speed = netw.playerPositions[i].isWalking ? walkSpeed * timer.GetDT() : sprintSpeed * timer.GetDT();
inPos.x += (float) (sin(-netw.playerPositions[i].angle.y * DEG) *speed);
inPos.z += (float) (cos( netw.playerPositions[i].angle.y * DEG) *speed);
} |
Jakýkoliv nápady sem, můj první multiplayer, pokud je už odpověď tady, tak mě nelynčujte, neviděl sem ji ;D
EDIT- zkurvenej BBCODE
Dikec Jatro
Naposledy upravil Játro.m dne 12. duben 2011, 19:14:13, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 12. duben 2011, 18:50:06 Předmět: |
|
|
myslim ze problem je v tom ze okamzite po prijati paketu posunies protihraca tam kde ti prislo ze je. tam by som pridal taktiez interpolaciu kde by som ho nechal aby na tu poziciu sa dosunul v pribehu nejakej pol sekundy. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Deluxe
Založen: 31. 07. 2007 Příspěvky: 235 Bydliště: Oslavany
|
Zaslal: 12. duben 2011, 19:14:18 Předmět: |
|
|
O lag kompenzaci (a interpolaci entit) je myslím zajímavej tenhle článek.
Je to popis, jak tohle řeší Valve v Source enginu, ale myslím, že něco z toho by se dalo použít.
Hlavní myšlenkou je asi to, že klient je vždy min. o jeden paket pozadu oproti serveru,
takže může interpolovat mezi posledním a předposledním paketem.
Už sem to tu někde zmiňoval, tak doufám že to nebylo zrovna tobě. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. duben 2011, 07:45:56 Předmět: |
|
|
Když pošleš pozici, kde hráč je, jeho rychlost a hlavně čas odeslání, tak novou pozici můžeš spočítat: pozice + rychlost * čas od odeslání. Zdálo by se jednoduché, ale je potřeba před začátkem komunikace sesynchronizovat čas (aby všichni účastníci měli stejně). To se mi bohužel nikdy nepovedlo, tak sme na LAN používali fixní hodnotu. Ale fungovalo. Nicméně jsou na to algoritmy a nědke tady na fóru se to kdysi probíralo. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 13. duben 2011, 07:56:34 Předmět: |
|
|
Diky za odpovedi, mrknu se na to, btw ]semo[, ta synchronizace nepujde protoze to bude ciste over net, takze se s tema lagama musim vyporadavat porad, myslim Nejak to poresim. |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 13. duben 2011, 08:07:42 Předmět: |
|
|
Ne, to by nevadilo, že to je přes net. Když jsem tenhle způsob testoval s umělýma lagama nepravidelný velikosti (tuším do 300 ms!), navíc v 3D fyzikálním prostředí, tak to běželo krásně plynule. Ano, mluvím opět o Aquadelicu, jak bývá mým zvykem.
Jediný probém skutečně je, seřídit ten čas s přesností na milisekundy. Ale pokud to pojede přes net, možná bys mohl využít nějakou internetovou službu (to já na LAN nemohl). _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 13. duben 2011, 10:58:02 Předmět: |
|
|
Játro.m napsal: |
ta synchronizace nepujde protoze to bude ciste over net, takze se s tema lagama musim vyporadavat porad, myslim |
Jo, ale tam jde čistě o to, abyste měli na začátku stejný čas (primitivně se dá nastavit opakovaným půlením intervalu), a když ti pak přijde paket, ve kterém bude napsané od klienta T1050, a ty budeš mít u sebe čas T1200, tak víš, jak se zachovat. |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 13. duben 2011, 12:22:27 Předmět: |
|
|
Presne tak. Urcite odporucam spravit na zaciatku synchronizaciu casu, je na to primitivny algoritmus, ktory vymyslite aj so sedliackym rozumom a dokonca aj bez nutnosti existencie vypoctovej techniky a bude to fungovat i pri sekundovom lagu. Tym samozrejme nemyslim zmenit systemovy cas, ale si len ulozit offset proti serverovemu casu
Btw, skuste si pustit 2 kompy na zaciatku zosynchronizovane na niekolko hodin a budete sa divit, ake su tam rozdiely v rychlosti toho timeru (ano, aj high precision counteru). _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
|