webForumDet fria alternativet

Spelprogrammering - Hur göra så att alla spelare ser samma sak?

Programmering

4 svar · 605 visningar · startad av erciz

Medlem sedan maj 20011 826 inlägg
Frågan#1

Hur gör man när man gör nätverksspel?

Säg att vi har tre spelare som spelar ett FPS-spel och går mot varandra i spelvärlden, hur gör man så att alla spelare ser samma sak, så att avstånden blir lika osv? för det tar ju ändå lite tid att kommunicera från en spelare (som tex. höjer handen) till spelservern och sen ut till de andra spelarna där detta ska renderas grafikmässigt? Finns det några knep? eller är hastigheten så snabb så att det inte är nåt problem?

Medlem sedan juni 20034 013 inlägg
#2

Tja, jag minns från den gamla goda tiden när man körde Doom över modem att själva spelet gick betydligt långsammare då, men sen dess har ju överföringshastigheten ökat en hel del, så det är nog inga större problem i dag. Det var ju inte ospelbart över modem, men man kände ju att det tog längre tid innan det hände något efter att man tryckte på en knapp...

Men det känns som att det inte är så stora datamängder som ska överföras, så det som spelar roll är nog i stället hur lång tid det tar för data att nå fram och tillbaka, typ "pingtid".

Medlem sedan juli 2003555 inlägg
#3

Rent allmänt så brukar det väl i regel gå till ungefär såhär:

Du har en server, det kan antingen vara en dedikerad server eller att någon av spelarna kör en server. Oavsett vad så finns det en server.

Du har sedan en klient som ansluter till servern. Varje spelare som är med har varsin klient.

Servern skickar sedan ut positioner på alla spelare, ev. rörliga objekt, annat som händer osv. till alla klienter, och allt servern säger är lag.. :)

På klienten är det så enkelt som att när du avlossar ett skott så meddelar du servern det, servern beräknar sedan om skottet var giltigt (så att du inte avlossar skotten snabbare än vad som är giltigt för ditt vapen, sedan om du träffat någon, och om så är fallet så meddelar den berörda klienter den informationen.

Likaså om du förflyttar dig framåt så kommer klienten meddela servern det, servern kontrollerar att förflyttningen verkligen kan ske, och att den kunnat vara så lång med hänsyn till maximal förflyttningshastighet. Vid behov så justerar den positionen. Sedan meddelar servern alla berörda klienter.

Såhär långt så har vi beskrivit en ganska "dum" klient; den skickar alla kommandon till servern, servern räknar ut vad som hänt, meddelar sedan klienten det, och till sist så agerar klienten och uppdaterar all information i sitt eget minne om var saker befinner sig osv.

Men.. Låt oss nu säga att vi skulle spela spelet i det här skicket, hur kommer användarupplevelsen att vara då? Låt oss säga att vi har en pingtid på 200 ms, dvs. en klart märkbar pingtid. Från att du tryckt på musknappen tills att du på skärmen ser, och i högtalarna hör, att skottet avlossas så känner du av en tydlig fördröjning. Vad gör vi åt det?

Jo, klienten får lite mer intelligens. Klienten tillåts avfyra skottet på en gång istället och göra alla beräkningar som servern gör, men.. De beräkningarna är bara temporära, så snart servern har svarat så skrivs klientens egna beräkningar över med serverns beräkningar. Nu kommer du inte längre uppleva fördröjningen och spelet känns inte längre långsamt och laggigt.

Det här kan dock ställa till problem, t.ex. om klienten och servern av någon anledning inte har klockor som räknar lika fort (har funnits sådana problem på t.ex. en del äldre AMD-processorer med dual core); klienten har beräknat en ny position när du rör dig, men servern har konstaterat att du rör dig för fort. Klienten kommer då tvingas anpassa sig och flytta tillbaka dig några hack konstant. Det ger en väldigt ryckig spelkänsla.

Andra problem är att även om du är stensäker på att du prickade din motståndare så måste du komma ihåg: du prickade den position där motståndaren vid avfyrningsögonblicket var. När servern väl får reda på det och sammanställer informationen ifrån alla klienter så kan det mycket väl vara så att motståndaren har duckat, eller har flyttat ett steg åt vänster. Du kan alltså inte vara säker på att det du ser och vad serven räknar på är samma sak alla gånger

Medlem sedan juli 200012 978 inlägg
#4

En riktigt bra beskrivning onkelborg. Det går väl mera mot bättre klienter och ett samspel mot servern. Kolla in SVT sändning från Jönköping med CS.

Medlem sedan maj 20011 826 inlägg
#5

Tack alla för väldigt bra svar! Nu har jag lite mer kött på benen. Kan hända att jag återkommer om jag får fler frågor.

251 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)