Råd til nybegynder

Frankie
Level 0 - Null
Posts: 6
Joined: 10 Mar 2008, 00:49

Råd til nybegynder

Unread post by Frankie » 10 Mar 2008, 00:55

Hej udviklere!

Jeg er netop startet på at programmerer applikationer, sådan lidt mere seriøst. Jeg har lavet meget web programmering og er ansat webudvikler. Jeg kunne godt tænke mig at lave et spil som kobler op til en server som indeholder data omkring personen og andre personer man evt spiller imod. Det jeg umidelbart godt kunne tænke mig at vide lidt om er hvordan dette gøres mest effektivt. Jeg er bedst til C#, men læste et sted at C#/Windows ikke er god til at håndterer mange connections på samme tid. Vil det være bedre at lave en sådan "server" i c++/linux?

På forhånd tak!

PS: Tak for at du fik sitet op igen Jonas! :D

EDIT: Serveren skal helst kunne håndterer en hel del klienter samtidigt.. måske 100.000?

Zee
Level 22 - Imp
Posts: 229
Joined: 10 Mar 2008, 10:40

Re: Råd til nybegynder

Unread post by Zee » 10 Mar 2008, 11:02

Doh...
Jeg havde skrevet et langt svar, og kom så til at ramme back-knappen på min mus og så var alt teksten væk :(

Så nu kommer det korte svar:
Jeg vil som sådan ikke mene der er noget i vejen med C#/Windows til mange forbindelser... Men havde du bare tænkt dig serveren skulle være til database adgang? I så fald er C# jo ikke indblandet, så kunne man jo bare forbinde direkte.. Og hvad for en netværksprotokol havde du tænkt dig at bruge, det betyder jo også en del? Og medmindre spillet er ekstremt slow-paced så kan du jo heller ikke have 1 server til at håndtere 100.000 klienter, har du overvejet det?
Derudover finder jeg det også yderst usandsynligt (no offence) at du skulle få 100.000 til at spille dit spil samtidigt, så måske er de realistiske krav til systemet lidt anderledes?

Frankie
Level 0 - Null
Posts: 6
Joined: 10 Mar 2008, 00:49

Re: Råd til nybegynder

Unread post by Frankie » 10 Mar 2008, 11:20

Hej Zee,

Mange tak for den korte version af dit svar :)

Jaa, jeg sad i går aftes og havde store tanker. Nu da jeg har fået lidt søvn kan jeg godt se at 100.000 klienter er lidt i overkanten :)

Lad os tweake lidt på det og sige.. i peak-hour, den 3 fuldmåne i februar hvert 4. år kan det ramme 10.000 brugere, men ellers omkring de 4-5000. Spillet vil være slow-paced og ikke afhængig af extremt hurtig svartid fra serveren. Altså, en form for arcade spil mod andre ala hjerterfri.

Jeg havde efter lidt læsning forstillet mig at bruge TCP protokollen. Serveren skal skrive/læse fra database, samt sende noget data til de klienter som er forbundet til den. Den skal kunne lave nogle kald til nogle andre servere mm.

Zee
Level 22 - Imp
Posts: 229
Joined: 10 Mar 2008, 10:40

Re: Råd til nybegynder

Unread post by Zee » 10 Mar 2008, 20:35

Hej igen.

OK det lyder altså som om dine tanker kan realiseres med en enkelt server, det er jo heldigvis en del lettere at lave end et multiserver setup (som jeg faktisk sidder og arbejdet med pt.) :)
Altså 4-5000 spillere er muligt med en enkelt server når det er et langsomt spil. Altså jeg forestiller mig et spil der ikke har nogen form for realtids-krav. Som dit eget eksempel hjerterfri, der betyder forsinkelse (enten over netværket eller p.g.a. serverens HW) jo ikke at man ikke kan spille, men bare at der er lidt ekstra ventetid. Men du kan godt glemme sådan noget med et spil hvor alle spillere skal modtage 10 beskeder i sekundet om hvad de andre spillere laver osv., men det lyder ikke som om det er noget du har planer om.
Med de nye informationer vil jeg helt klart anbefale at du holder dig til C#/Windows, da det er noget du kender godt i forvejen. Den kortere udviklingstid (og færre frustrationer p.g.a. kendt programmeringssprog) er mere værd end at du evt. kunne have lavet en server der kørte hurtigere i C++. Man skal også huske på at en stor del af arbejdet når du enten henter eller gemmer data i databasen via din server sker på netværket og i DBMS´et, og det ville jo ikke gå hurtigere ved at serveren var kodet i C++.
TCP protokollen er let at arbejde med da den er reliable, og du får besked hvis en klient går ned... Det er så på bekostning af at den er ret langsom ift. UDP, men hvis du ikke har de store tidskrav kan TCP spare dig for meget besvær. Og selvom du så skal have en connection (port) til hver client har du jo stadig langt over 10.000 at vælge imellem.
Held og lykke med projektet i hvert fald, du kan bare sige til hvis du støder på nogle problemer eller lign.
Jeg kan lige nævne at du skal være opmærksom på at TCP er stream-oriented og hvis du altså sender en fin lille besked (f.eks. en custom class med nogle properties) kan du ikke være sikker på at modtageren får den som en besked. Når modtageren får en "besked" kan det både være en lille del af det du har sendt, eller flere beskeder du havde sendt der er blevet samlet - det kan give nogle udfordringer... En anden ting er at hvis du vælger at serialize et objekt (med .NET's indbyggede serializing) og sende det så du hos modtageren kan deserialize så skal du regne med at kæmpe overhead, det kan godt være pakken bliver 5-10 gange så stor. Så det er altså ikke altid en god løsning, men kommer igen an på kravene til systemet.

Frankie
Level 0 - Null
Posts: 6
Joined: 10 Mar 2008, 00:49

Re: Råd til nybegynder

Unread post by Frankie » 11 Mar 2008, 11:07

Hej Zee,

Tak for dit svar, det lyder godt.

Jeg har selvfølgelig krav til tiden, men det er relativt åbent. Et "delay" på 1-2 sekunder er acceptabelt syntes jeg. Hver spiller har f.eks. 15 sekunder til at foretage sit træk. Grunden til at jeg sagde TCP var netop at der er kontrol af de pakker som bliver sendt, det er rimeligt vigtigt at informationen som bliver sendt er korrekt, men vil UDP være et bedre valg?

Igen, mange tak for dit svar, det har været en stor hjælp!

User avatar
Scarzzurs
Level 5 - Youngling
Posts: 50
Joined: 09 Mar 2008, 11:34
Contact:

Re: Råd til nybegynder

Unread post by Scarzzurs » 11 Mar 2008, 12:49

UDP bør stort set kun bruges til realtime...
Hvis din pakke alligevel er ligegyldig inden en kopi kan nå at afsendes og modtages, så er UDP en real mulighed...

Folk der bruger UDP ender også tit med selv at inplementerer mange af de features tcp har, så derved taber man let den fordel udp har...

Men lyder klart som om at du skal bruge TCP...
Et tip er dog at forsøge at undgå at sætte tcp forbindelse op og pille den ned hele tiden, det tager nogen tid, så hvis forbindelsen kan få lov at leve lidt tid, er det altid en god ting :-)

- Scarzzurs
Medejer i Whalegun ApS og arbejder for tiden på Utopia 9.
Du kan følge spillet på Facebook og Steam Greenlight

User avatar
beyond
Level 5 - Youngling
Posts: 50
Joined: 10 Mar 2008, 18:29

Re: Råd til nybegynder

Unread post by beyond » 12 Mar 2008, 11:49

Der er masser af open source pakker derude, der er lige til at flette sammen med dit spil/din applikation. Mit forslag vil være at du finder en af dem og får tingene op at køre, så du har et proof of concept og kan koncentrere dig om de andre ting også. Når du så en dag ved at du går i gang med den store model om n måneder og har brug for at kunne håndtere 100.000 samtidige brugere, så er du også blevet klogere på feltet og kan dimensionere selv i antallet af servere, deres interne kommunikation og slige sager.

Man kan bruge måneder og år på netværkskodning... det er nemt at blive fanget i detaljerne og ikke nå andet.
Theo Engell-Nielsen, beyond.dk

Frankie
Level 0 - Null
Posts: 6
Joined: 10 Mar 2008, 00:49

Re: Råd til nybegynder

Unread post by Frankie » 12 Mar 2008, 12:51

Hej igen!

Tak for jeres svar! Ja min plan var at starte med kun at lave serveren og en client. Teste lidt hvordan det ser ud med svartider, sende lidt data frem og tilbage osv, herefter involverer nogle flere personer så jeg kan teste hvordan det ser ud med flere clients forbundet samtidigt.

Glæder mig til at komme igang, er dog lidt presset med arbejde for tiden.

Post Reply