Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 31. leden 2008, 02:12:51 Předmět: [Server - Client] Chůze |
|
|
mam takovej problem...
mam 2d tile based hru (a mam server a client) "mmo"
a mam v ni chozneni "po pixelu", a nevim presne jak bych to mel posilat serveru... nepochybne sou na to nejaky techniky, uz jen kdyz counterstrike posila informace o kazdym pohybu myši...
napadlo me to udelat nejak takhle,
kdyz se klient zacne pohybovat -> tak se serveru posle ze se zacal hybat, a ten vsem klientum okolo posle ze se zacal ten jeden hybat
kdyz se prestane pohybovat -> tak se serveru posle ze se prestal pohybovat a taky souradnice kam az dosel (neresim moc ze by lidi mohli podvadet se speedhackem atd a predbyhat se) a server posle vsem zese prestal hybat a jeho novy souradnice (ktery se u vsech klientu aktualizujou)
server aji klient bezi dost jinak takze neni moc realny abych na obojim pricital pri kazdym cyklu o kolik sem se posunul protoze by to bylo logicky uplne jinak (i kdyz by to slo nejakyma "časovýma" podminka ale nevim presne jak)
ale tohle dela to ze ten klient obcas poskoci (coz je celkem logicky ze...) a nemam tuseni co by to delalo pri vetsim poctu klientu...
tak jestli nekdo vite jak se to dela normalne klidne napiste... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 31. leden 2008, 09:34:35 Předmět: |
|
|
To chození máš udělaný klikáním? Že třeba někam haráč ukáže, klikne a postava tam dojde? Jestli jo, tak by bylo nejlepší poslat jen ty cílový souřadnice a ať si to každej počítač projde sám. Ale píšeš, že klienti a server běží "dost jinak" tak nevím, co tím myslíš. (I kdybys měl různý path finding na všech počítačích, můžeš poslat několik bodů mezi kterýma bude chodit po přímce. )
Že pošleš "začal se hýbat" znamená, že pošleš směr kterým jde?
Když sem dělal synchronizaci fyziky na síti do hry Aquadelic, posílal sem informace typu (zjednodušeně) "Objekt X je na pozici P, pohybuje se vektorem rychlosti V a je právě čas T". Z toho se dá předpovídat přibližně nová pozice.
Každopádně myslím, že při synchronizaci síťový hry, je nejdůležitější mít stejný herní čas na všech počítačích. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Hardwire
Založen: 04. 09. 2007 Příspěvky: 117
|
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 31. leden 2008, 13:15:41 Předmět: |
|
|
2]semo[: mam to udelany tak ze kliknu doleva a postava zacne jit doleva, a posilam smer (doleva, doprava, nahoru, dolu)
a tim ze bezi jinak sem myslel ze tu pozici aktualizuju v nekonecne smycce, a stejne tak server bezi v nekonnecne smycce, takze kdybych a serveru vsechny hrace posouval tak by se nepochybne posouvali uplne jinou rychlosti nez u klienta....
2Hardwire: prectu, dik |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 1. únor 2008, 09:01:20 Předmět: |
|
|
Asi si to nechtěl slyšet, ale časovou synchronizaci na pohyb budeš potřebovat. Přece na rychlejším kompu nebudou ty postavy běhat rychlejc než na pomalejším! _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 2. únor 2008, 21:31:21 Předmět: |
|
|
no ale treba ultima online nic takovyho nedela (jako z pohledu server-client) nevim jak si to klient resi sam... (sice se v ultime chodi po ctvereccich ale prejiti jednoho trva cca 1/10sec...)
no a me je celkem jedno ze nebudou synchronizovani o chozeni v te hre nejde...
ale asi to stejne cely predelam mel sem to v XNA a tak trochu je slozity to rozjet na jinych pc, nehlede na to ze to neni moc delany na pouzivani mysi nebo klavesnice... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. únor 2008, 12:00:02 Předmět: |
|
|
No jak říkám, postaral bych se o to, aby na všech kompech trvalo přejití stejné vzdálenosti stejný čas a pak bych posílal jen souřadnice, kam se má dojít. Myslím, že se to tak dělá.
Nebo případně pokud by hráč měl různý nastavení rychlosti chůze, tak posílat ještě kromě cílového bodu i rychlost. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 3. únor 2008, 19:38:21 Předmět: |
|
|
jak sem psal tahle hra nefunuje tak ze kliknes a postava jde na nejaky misto, ale ze drzis sipku a postava se pohybuje... |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 3. únor 2008, 19:54:19 Předmět: |
|
|
Jo ták...to mi uniklo.
Už chápu tvé předchozí příspěvky, tím "běží dost jinak" si myslel právě ten čas, že? Ne že by postava chodila jinou rychlostí :)
Bylo by nejlepší na začátku hry (připojení hráče do hry) seštelovat čas se serverem (neříkám, že se to dělá snadno..) co možná nejpřesněji. Pak stačí poslat k tý události začátku chůze i čas, kdy se tak stalo. Podle toho snadno vypočteš kolik už postava ušla a můžeš její pohyb mírně zrychlit (aby to neposkočilo). Když bude pohyb dostatečně dlouhý, nikdo si ničeho nevšimne a postava dojde na správné místo.
Pokud nepoužiješ pro to seštelování herního času nějakou velmi sofistikovanou metodu, pravděpodobně se ti nepodaří dosáhnout přesný synchronizace. Proto bych ještě zaved nějakej drobnej fejk; když po skončení chůze pošelš ty přesný souřadnice a postava bude jinde (a mělo by tak dojít k poskočení), prostě by se mohla otočit a dojít na správné místo. Případně její pozici interpolovat se správnou.
EDIT: A na závěr mě napadá možná nejjednodušší řešení: Ten klient je vždy při chůzi trochu napřed, vadilo by moc, kdyby se na ostatních počítačích zpoždění neřešilo? Pak bys poslal "začátek pohybu", ovšem je jasný, že na klientovi, který to poslal, dojde do cíle dřív, než na ostatních klientech. Takže bys po skončení chůze poslal cílový souřadnice (nebo spíš vzdálenost od začátku chůze, směr už znáš) a teprve až by hráči na ostatních klientech došli do cílového bodu, tak by se zastavili.
Je to vlastně přesně to, co si psal v prvním příspěvku, ale neukončíš pohyb hned jak přijde zpráva o ukončení pohybu, nýbrž až dojde na cílové místo.
Mohlo by se stát, že ho přejde (ale snad ne tak často, pokud nebude velkej rozptyl sítě), pak bych použil výše uvedený fejk. _________________ 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: 4. únor 2008, 08:59:40 Předmět: |
|
|
Synchronizace herního času je jasný základ, ale to fejkování bych asi moc neřešil. Pokud si vybavuju správně Quake II, při lagnutí na síti člověk viděl jinou postavu pokačovat předchozím směrem (delta a rychlost) a když se následně zjistilo, že je jinde, prostě se tam instantně přesunul. Šlo taky o to, že na LAN tohle bylo spíše výjimečné, takže to hře moc nevadilo _________________
|
|
Návrat nahoru |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 4. únor 2008, 17:35:25 Předmět: |
|
|
Ja bych doporucil prostudovat napriklad MaNGOS project popripade Antrix project, odpoved jak korektne resit tu chuzi tam urcite najdes. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 7. duben 2009, 23:47:10 Předmět: |
|
|
Tak sem se do něceho podobnýho pustil znova a měl bych pár dotazů
myslíte si že je možný udělat něco jako 2d střílečku přez TCP? (nemůžu používat UDP, a nevím jak moc je ta rychlost znatelná)
mám ale hlavně trochu problém se synchronizací na klientech, protože když je latency třeba 150ms a někdo začne rotovat, tak než dojde zpráva že už rotovat přestal tak je otočenej o hrozně moc stupňů dál (což má taky dost negativní vliv na to že přitom šel rovně, protože pak je úplně jinde než měl být)
jediný řešení co mě napadlo, je uměle zpozdit akce klienta, tzn že sice obdržím že začal rotovat, ale nebudu nic 150ms (tenhle čas by záležel na latency zjištené serverem) dělat
no a otázka, neexistuje pro tohle nějakej ověřenej postup? ten článek co tady byl mě připádá že má akorát řešit když packety nepřicházeji ve správným pořadí, nebo když neposílam pozice, ale jen změny stavu
(podle vzoru wow emulatorů posílam při každé změně pohybu, současnou pozici a rotaci) |
|
Návrat nahoru |
|
|
pcmaster
Založen: 28. 07. 2007 Příspěvky: 1824
|
Zaslal: 8. duben 2009, 00:50:51 Předmět: |
|
|
Lagu sa proste nezbavis. A to hlavne lagu sposobeneho vstupom od uzivatelov.
Ostatnych delayov sa mozes ciastocne zbavit a to rozumnou predikciou.
A myslim si, ze ti bude stacit jednoducha linearna predikcia ci kvadraticka predikcia (curve fitting) a k tomu posielat data ako to napisal semo ci mem (pre 3D napriklad celu maticu a rychlosti (linearne a uhlove), pripadne ekvivalenty a CASOVU ZNAMKU). Verim tomu, ze hry to v zaklade robia vzdy ako napisal mem (poznamka o Q2) + nejaka lepsia predikcia a tak.
Samozrejme mozes posielat aj akcie klientov namiesto priestoro-casovych udajov, lenze to nemusi byt uplne vhodne, pripadne kombinaciu (a hlavne vlastnorucnemu CASOVEMU znackovaniu paketov, ci inej temporalnej synchronizacii sa proste nevyhnes).
Ja si myslim, ale musim sa priznat, ze som to nemeral, ze TCP bude ukrutne pomalsie nez UDP a urcite by som ho nepouzival - TCP akurat pre fakt dolezite, malo frekventovane spravy.
Co sa tyka pohybu po pixeloch, ja by som to okamzite prepisal na floating point Ak ti to dovoluje cielova platforma, co bude predpokladam PC alebo nieco s koprocesorom, ze... _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 8. duben 2009, 10:11:26 Předmět: |
|
|
on jako není problém když se někdo hýbe tak že jde rovně nekolik sec pak se otočí a zas jde rovně, ale když začne strašne rychle mačkat tlačítka tak to po chvíli začne dělat uplně divný věci (teda nevím jestli to neni tím že mám někde chybu )
možná sem zapoměl napsat že to funguje tak že se prvně musíš tím směrem otočit a pak až jím můžeš jít, takže posílam jen rovne, dozadu, otacetdoleva, otacetdoprava
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)
UDP použít nemůžu protože používám Silverlight
s tima pixelema sem to moc nepochopil, jakože nemyslel sem že mam pozici uloženou jako int, mam ju jakou double (nechtělo se mi psat vlastni Point s floatem tak sem použil windowsovskej)
tim sem jen chtěl říct že se ne pohybuju po čtverečcích |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 8. duben 2009, 11:49:03 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) |
Ty jsi to možná ještě nepochopil, ty musíš udělat na začátku synchronizaci a pak už s tím pracuješ.
- Pustíš server a začne běžet interní čas (0, 1, ...)
- Klient se připojí a vyžádá si aktuální čas a odpoví na něj, server si změří jak dlouho trvalo než přišla odpověď, vydělí to 2 a tím získá rozdíl, o který je klient vzdálen (opožděn). Tohle je nejjednodušší metoda synchronizace (plus bys měl provést několik pokusů), ale teoreticky když tohle provedeš a pošleš klientovi informaci o rozdílu, bude si schopen lokálně nastavit stejný čas jako na serveru (takže když server bude mít 7, klient bude mít taky 7)
- Když pak přijde nějaká informace o pohybu hráče, tak tam bude: čas 7, poloha xy, vektory pohybu dxdy
- Klient se u sebe mrkne a zjistí, že už je čas 9 (protože ten paket nějakou dobu putoval), takže k té poloze z času 7 co mu přišla rovnou dopočítá ten pohyb dxdy, aby mohl hráči zobrazit "reálnou" polohu v danou chvíli
- atd. Pro krátké časy by to nemělo dělat problém, pokud to "lagne" nebo hráč prudce změní směr, může být vidět cuknutí, ale to měl Q2 taky a nikoho to ne*alo _________________
|
|
Návrat nahoru |
|
|
|