mboost-dp1

LAN spil med Synkronisering


Gå til bund
Gravatar #1 - Windcape
9. mar. 2009 15:37
Hej

I forbindelse med en opgave skal jeg udvikle et simplet LAN netværksspil.
Men der er et meget bestemt krav jeg ikke rigtig kan få til at hænge sammen med normal udvikling af netværks applications.

Mine spillere skal være enige om stillingen (antal points), og positionen af de andre spillerer på kortet.

Jeg synes det strider mod alt form for logik, da i de andre former for spilserverer jeg har været med til at arbejde på, har det altid været serveren som bestemte ultimativt.

Umidbart ville jeg løse det ved at sende et GameState som indeholder informationerne omkring hvad spiller A ser, når spiller A flytter på sin brik.

Og så sende den videre til spiller B og spiller C.

Men problemet er så hvad der sker når flere spillere foretager sig noget samtidigt. Hvordan kan man så validerer hvad der er korrekt?

En løsning ville være f.eks. timestamps, men så er klienterne jo ikke ENIGE da der i sidste ende ville være een som er mere korrekt en de andre.

Så jeg kan slet ikke få ind i hovedet hvordan klienter kan være enige om noget som helst på et netværk. Det burde jo bare være serveren (spillets host) som bestemmer (alm. simpel broadcast).

Nogle ideer om hvad der kan menes med at være "ENIGE" ?
Gravatar #2 - Jonasee
9. mar. 2009 16:12
Du kunne vel lave et system der minde om token ring, det ville ikke give det optimale oplevese for spilleren, men det ville være en løsning
Gravatar #3 - arne_v
9. mar. 2009 18:06
Skal spillerne eller client instanserne vaere enige ?

Spillerne vil nok kræve en "efter tur" model for selve spillet.

Client instanserne kræver en locking/synkroniserings mekanisme, så kun en af dem kan ændre game state ad gangen.
Gravatar #4 - Windcape
9. mar. 2009 19:14
arne_v (3) skrev:
Skal spillerne eller client instanserne vaere enige ?
Client instanserne.

Jeg har tænkt på følgende:

Client A sender forespørgsel på bevægelse OP (direktionsbevægelse, et felt af gangen).

Serveren (hosten) vertificerer om dette er valid.

Hvis det er valid, sender serveren bevægelsen til alle clienter, inklusiv client A.

Client A opdaterer sin egen position når dataen modtages.


Men ved ikke rigtig om det tæller som ægte synkronisering.
Gravatar #5 - arne_v
9. mar. 2009 19:21
#4

Jeg tænker på noget a la:

A-server: request lock
server-A: grant lock
A-server: X
server-B: X
B-server: ack
server-C: X
C-server: ack
(server releases lock)
Gravatar #6 - Windcape
9. mar. 2009 19:28
Ja, det lyder som en god ide.

Men så set fra et performance synspunkt, lyder det rimelig ineffiktivt.
Plus man skal queue de forskellige requests, går jeg ud fra?

(Det skal kodes i java, men det burde ikke betyde noget.)
Gravatar #7 - arne_v
9. mar. 2009 19:34
#6

Den tekniske låsning bør ikke give så meget overhead - under 100 millisekunder.

Serialiseringen af brugernes actions vil have en mærkbar effekt, men den er vel givet grundet kravene.
Gravatar #8 - arne_v
9. mar. 2009 19:38
#6

Hvis du vil lave en masse funktionalitet uden at kode alt for meget kunne du kigge på JGroups.
Gravatar #9 - Windcape
9. mar. 2009 23:49
JGroups ser smart ud, men vil nok prøve manual implementering for at arbejde med det på et mere grundlæggende plan.

Jeg siger mange tak :)
Gravatar #10 - mazing
23. mar. 2009 19:52
Det du nævner i #4 er sådan de fleste FPS spil virker + noget lagcompensation.

Så når PlayerA bevæger sig fremad, flytter han sig med det samme på sin egen skærm, men det er bare en "illusion" for at det skal føles real-time. I virkeligheden sker det som du beskrev, og hvis serveren så er uenig med at den bevægelse kan lade sig gøre, blive spilleren flyttet tilbage igen. Det betyder så at spilleren kan opleve pludseligt at blive kastet tilbage (som det måske kendes fra CS når der er lidt lag)...

Jeg har selv lejet med tanken om at lave et lille FPS spil med netværkssupport.. så jeg har et par artikler bookmarked...

http://developer.valvesoftware.com/wiki/Source_Mul...

http://fabiensanglard.net/quakeSource/quakeSourceN...
Gravatar #11 - JensOle
23. mar. 2009 20:34
Windcape (1) skrev:
I forbindelse med en opgave skal jeg udvikle et simplet LAN netværksspil.
Men der er et meget bestemt krav jeg ikke rigtig kan få til at hænge sammen med normal udvikling af netværks applications.

Mine spillere skal være enige om stillingen (antal points), og positionen af de andre spillerer på kortet.


Nu ved jeg ikke hvad det er for en opgave men kunne det ikke vaere en daarlig oversaettelse.
"Enige" kunne maaske forstaas som om at alle spillere skal kunne se de samme data.
Du siger selv at der er tale om et simpelt LAN spil.
Gravatar #12 - kasperd
23. mar. 2009 23:19
Windcape (1) skrev:
Mine spillere skal være enige om stillingen (antal points), og positionen af de andre spillerer på kortet.

Jeg synes det strider mod alt form for logik, da i de andre former for spilserverer jeg har været med til at arbejde på, har det altid været serveren som bestemte ultimativt.
Der findes et område som heder byzantine agreement, som netop drejer sig om hvordan computerprogrammer i et netværk kan blive enige uden at involvere en enkelt part som alle stoler på.

Men min fornemmelse er, at det ville være overkill til et computerspil.

Løsningen med en central server der ultimativt bestemmer er langt mere effektiv. Den største ulempe er hvis serveren går ned eller forsvinder fra netværket.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login