[ Dark Icarus @ 12.09.2005. 09:28 ] @
U poslednje vreme se igram sa DirectPlay-om i uspeo sam da uspostavim komunikaciju između 2 instance svoje igre. Imam protok podataka, imam i neku generalnu ideju kako bi koje direktive i instrukcije išle kroz mrežu, ali nemam nikakvog praktičnog iskustva sa mrežnim programiranjem igara, tako da nemam pojma sa kakvim brojevima da baratam. Pretpostavljam da je moje glavno pitanje u stvari "kako se to inače radi u svetu igara?" Ne želim da trošim vreme idući u ćorsokake.

1) koliki treba da mi bude max. protok po jednom peeru na 56k modemu? (Prvi pametnjaković koji kaže "maksimalno 56 kilobita po sekundi" dobiće po glavi .) Pitam iz praktične perspektive, znam da je iz raznoraznih razloga deo protoka rezervisan, da upload i download koriste odvojene "delove" bandwidtha itd... tako da, sigurno nije 56k nego manje... e sad, koliko manje? 30kbps? 5kbps? 1kbps? Nije svejedno...

2) koliki je prosečan procenat gubitka paketa preko 56k telefonskog modema?

3) Čuo sam neke loše stvari o TCP/IP protokolu, u smislu da ako ispusti samo jedan paket, ne prima druge dok taj jedan ne stigne. Kada pošaljem poruku preko DirectPlayPeer.SendTo poruke, veličine (recimo) 1000 bajta, da li se ta poruka šalje kao paket preko interneta ili biva rasparčana u delove? Drugim rečima, da li je slanje jednog paketa od 10k bezbednije od slanja 10 paketa po 1k?

4) Koji je optimalni interval za slanje apdejta? Čuo sam da routeri ne vole da primaju veliki broj malih paketa jer treba više vremena da se procesuje queue. Kažu da je Quake 1 slao 10 apdejta u sekundi i da je to bilo sasvim dovoljno. To je fino, ali Quake 1 je izašao '97...

5) Po vašem iskustvu, ako planiram da imam 8 igrača, da li je bolje da koristim klijent-server topologiju?

6) U peer-to-peer topologiji, ako pošaljem 100k podataka GRUPI od 4 igrača, koliko će kilobajta "izaći" kroz moj modem? 100 ili 400? (Pitam jer mi je logično da postoje neki protokoli koji "pametno" menadžuju podatke, ali plašim se da nije sve logično u svetu kompjutera...)

7) Da li se praktikuje da se peerovima (koji nisu host) prepušta da sami računaju podatke o gameworld-u ili se SVE bitne stvari vrše na hostu, a peerovi samo "popunjavaju praznine" dok ne stigne sledeći apdejt sa hosta? (Naravno, govorim samo o bitnim entitetima u gameworldu, a ne o efektima u igri koji mogu i da se procesuju lokalno)

Razlog što sve ovo pitam umesto da sam radim benchmark je prosta logistika - naravno da će igra na LANu da radi k'o podmazana, ali ne mogu da tek tako uradim internet test.

Hvala na svakoj pomoći.
[ Vladimir P. Filipovic @ 12.09.2005. 14:53 ] @
Sto se tice pitanja br. 3, to sto si cuo se odnosi na UDP i TCP.

UDP je "fire & forget" protokol. Posaljes paketic i ne znas ni kad ce stici ni da li ce uopste stici.

TCP je protokol viseg nivoa koji koristi UDP da bi obezbedio da sve stize i da stize pravim redosledom. Podelice podatke proizvoljne velicine u UDP pakete, pa ako cuje da neki nije stigao slace ga ponovo. Na drugom kraju veze neko pazi na redne brojeve paketa i spaja ih ponovo u onaj oblik u kojem su bili, tako da ti i ne razmisljas o tome da ispod svega toga leze neki UDP paketi. Cena ovoga je to sto moras da cekas da stignu redom.

Ne znam tacno koliki su UDP paketi ("datagrami") ali se radi o fiksnoj velicini od par stotina bajtova - ne mozes da saljes 10k kao jedan paket. Ako koristis TCP, tvoji "paketi" mogu da budu proizvoljne velicine.

Ukratko, UDP je protokol nizeg nivoa i zato je rad s njim nekomforniji, ali mogu da se postignu neke stvari koje sa TCP-jem ne mogu. Kao asembler naspram C-a.


Za ova pitanja sam jako nesiguran u ono sto pricam, pa primi to s rezervom. Mozda lupam gluposti:

2: To sto ides preko modema nema nikakve veze s gubitkom paketa. Ono sto ima veze su svi cvorovi mreze izmedju dva racunara.

4: Ako ides preko interneta to ne bi smelo da ima veze.

6: Verovatnije 400.

7: Mislim da je uobicajeno (i pametno i prakticno) da to radi samo host. Ali cuo sam da u Starcraftu od trenutka startovanja nivoa vise niko nije glavni, nego su svi ravnopravni "hostovi" i to ocigledno dobro radi. Ali ipak je to samo rekla-kazala.

[Ovu poruku je menjao Vladimir P. Filipovic dana 12.09.2005. u 15:56 GMT+1]
[ bkaradzic @ 14.09.2005. 05:24 ] @
Citat:
Dark Icarus: 4) Koji je optimalni interval za slanje apdejta? Čuo sam da routeri ne vole da primaju veliki broj malih paketa jer treba više vremena da se procesuje queue. Kažu da je Quake 1 slao 10 apdejta u sekundi i da je to bilo sasvim dovoljno. To je fino, ali Quake 1 je izašao '97...

Zavisi od tipa igre i arhitekture za mrežu za koju si se opredelio. Igra na kojoj trenutno radi šalje samo 5 updateova u sekundi. Dozvoljeni lag je 400ms, posle toga se peer game update zaustavi dok se čeka na update. Mi koristimo tzv. lock-step arhitekturu. Ukratko svi peer-ovi prolaze kroz isti kod uvek, ali je veličina paketa smanjena na minimum, jer se šalju samo osnovni podaci neophodni za funkcionisanje igre. Mana ovoga je da ako se nekim slučajem ne izvrši istovetan kod na dva peer-a oni izlaze is sync-a i prakično postaju potpuno dve razdvojene igre. Takođe dinamičko priključivanje u igru je problematično, jer praktično moraš da dovedeš peer-a u stanje u kojem se nalaze ostali peer-ovi, što uglavnom pravi probleme ako snimanje stanja igre ne napravi identičnu kopiju stanja na novom peer-u.
Citat:
Dark Icarus: 6) U peer-to-peer topologiji, ako pošaljem 100k podataka GRUPI od 4 igrača, koliko će kilobajta "izaći" kroz moj modem? 100 ili 400? (Pitam jer mi je logično da postoje neki protokoli koji "pametno" menadžuju podatke, ali plašim se da nije sve logično u svetu kompjutera...)

Ako koristiš UDP protokol onda više od 400K. Da bi imao dobre performanse najbolje je poslati redundantne pakete peer-ovima. Praktično šalješ podatke sve dok ne dobiješ nazad informaciju da je paket stigao na odredište (ili dok ne budeš izbačen iz igre zbog loše veze :).

Nisam nikada radio sa DirectPlay-om, ali mislim da oni vode računa o tome šta i kada šalju, tako da ti ne moraš da se zezaš sa mrežom na niskom nivou (mislim?).

Citat:
Vladimir P. Filipovic: 7: Mislim da je uobicajeno (i pametno i prakticno) da to radi samo host. Ali cuo sam da u Starcraftu od trenutka startovanja nivoa vise niko nije glavni, nego su svi ravnopravni "hostovi" i to ocigledno dobro radi. Ali ipak je to samo rekla-kazala.

Tačno. Oni koriste P2P i lock-step (sve strategije uglavnom koriste lock-step). Unreal 1 je koristio lock step takođe (ali U1 važi za igru sa lošim network kodom).
[ Dark Icarus @ 19.09.2005. 11:55 ] @
Hvala na informacijama, biće od koristi

Prokopao sam malo po gamasutri i uglavnom našao odgovore na pitanja koja sam postavio, tj. našao sam odgovor tipa "može i ovako i onako, sve je već rađeno u multiplayer igrama, svaki pristup ima svoje prednosti i mane". Tako da se sada sve svodi na testiranje pa da vidimo koji pristup najbolje radi u praksi. Pošto uradim multiplayer testove, postovaću rezultate ovde za buduće generacije. Imam idealne uslove za stress test: najgoru moguću internet konekciju u Evropi.

U svakom slučaju, hvala na pomoći!
[ Dark Icarus @ 05.10.2005. 14:52 ] @
Okej, sjajno, krenulo se, u LANu radi odlično, ALI sada imam još jedno pitanje koje takođe moram priznati da postavljam iz čistog neiskustva:

'Oću da stavim TCP/IP igranje preko interneta. DirectPlay radi posao oko razmene podataka vrlo dobro, ali sada se javlja drugi problem: kako da se igrači međusobno nalaze na internetu?

Pošto mom TCP/IP protokolu treba validna adresa da bi se na nju igra konektovala, prvo što mi pada na pamet je da moram da zakupim neki konstantni "gateway" IP broj na nekom serveru 24h dnevno i da u igru hardkodiram da se sve kopije povezuju na dotični IP. (ili nekoliko IPa kao u WC III, ili IP koji se može ručno menjati ako korisnik hoće da overrajduje server... ali razumete šta hoću da kažem)
Na tom IPu ih verovatno "čeka" neki program, koji im onda šalje međusobne adrese drugih peerova i onda se oni povezuju i dalje komuniciraju bez učešća servera.

Da li sam pravilno potrefio?

Podsećam, samo je frka da se igrači nađu, sve posle toga će ići peer-to-peer bez ikakvog prisustva servera.

Ako već treba da zakupljujem neki server (ili kako se to već kaže, STVARNO nisam u toku sa arhitekturom interneta), da li to znači da treba da ja lično napišem neku server aplikaciju koja će sakupljati dolazeće "pingove" peerova na tom serveru. I šta onda? Plaćam serveru da drži aplikaciju uključenu 24h dnevno?

Ukratko, koga ja da kontaktiram i kome da plaćam mesečno da drži moj server "connector" program da radi ceo dan? Ili možda postoji neki besplatan servis za to (upita on naivno...)? I naravno, pošto ću ionako zakupljivati domen za igru, (npr. www.xenophobiagame.štagod), koliko se to razlikuje od zakupljivanja PROSTORA na nekom serveru; a koliko se opet zakupljivanje PROSTORA razlikuje od toga da oni stalno drže moj program uključen?

I konačno, ima li neko kod nas (neki posrednik) ko se bavi ovim zavrzlamama, i kako je to u inostranstvu i koga da kontaktiram za to? Poimence, hoću neki server koji je fizički lociran u severnoj americi; da li to znači da sad sledi cimanje oko plaćanja preko kreditne kartice... itd.

Ili to funkcioniše na neki drugi način?
Npr. Da li postoji neki drugi direktan način na koji dve instance jedne aplikacije mogu da se pronađu na internetu bez predefinisanih IP lokacija??? Da li se preko DirectPlayLobby klase (koju do sada nisam koristio a čini mi se da radi nešto slično) ovaj problem može zaobići?

Pa ko pripomogne, ide direktno u creditse!
[ visla @ 05.10.2005. 15:59 ] @
1 Kako da se igraci nalaze medjusobno na internetu?
Ovo ces resiti kao sto si i sam naveo. Moras imati neku staticku IP adresu odnosno server koji koristis. Kada se pocinje igra onda igraci razmene medjusobno IP adrese koristeci server kao poznatog. A nakon toga ti server vise nije potreban.

2. Pominjes Peer-to-peer za internet. HM... koliko sam ja znam nijedna igra skoro ne radi vise tako. Peer-to-peer preko interneta. Mozda u LAN-u ali nikako za internet.
Prvo sto imas puno zezanja oko toga da li su u sinhronizaciji posto nemas pravi server. Drugo sto ako imas 8 igraca to znaci da neko ko je npr .na dial up-u mora da salje 8x vise podataka nego da imas jedan server. A to sto ce server da salje na 8 igraca to je ok jel on ima bandwidth za tako nesto.


3. Koga da placas? pa ja sam cuo za neke strane agencije koje ti daju to sto hoces za 30$ mesecno (naravno imas ogranicenja koja nemam pojma koja su)

4. Ne postoji nikako nacin da pronadjes IP adrese igraca tek tako na interentu. U lan-u postoji IP 255.255.255.255 koji oznacava da svi u lanu prime paket ali to na internetu ne funkcionise tako.

E sad nekoliko mojih saveta ili predloga ukoliko radis igricu za mrezu i planiras internet. Nikako nemoj praviti nikakav Peer-to-peer. Napravi jedan server koji salje svim igraicima poruke a svaki igrac salje samo serveru. Tu je server avatar nad ostalima i on kontrolise pravila. Jednostavnije je uraditi sinhronizaciju.

Takodje ako planiras da uradis neku igru koja zahteva brzo kretanje ili cesti update stanja igre (tipa FPS), onda nikako ne radis preko TCP/IP-a neko preko UDP-a.
Za strategije mozes ici preko TCP/IP-a koliko znam onaj Age of Empires je odradjen tako i radio je kako treba.

Ali i dalje imas problem oko sinhronizacije koji nije tek tako lako za resiti. Moras paziti da u istom trenutku moze da igra igrac koji jedva da ima dial-up :) i igrac koji ima 1MB/s. I to sve treba da radi kako tako OK.

Nadam se da sam ti pomogao makar malo.
[ Srki_82 @ 05.10.2005. 16:21 ] @
Kako sa UDP paketima biti siguran da je klijent primio poslati paket? Ja sam radio tako sto sam sve pakete koje klijent MORA da primi slao preko TCP, a one koje bi klijent TREBAO, A NE MORA da primi slao preko UDP. Oni koji su mi bili bitni su bili pocetak i kraj kretanja, pocetak i kraj pucanja, a ostali (pocetak i kraj okretanja, gestures) sam slao preko UDP. Ne znam kako bih se samo oslonio na UDP. Ne verujem da je dobro resenje da klijent posle svakog primljenog paketa vraca serveru potvrdu da ga ja primio, zar ne?
[ bkaradzic @ 05.10.2005. 18:38 ] @
Citat:
Dark Icarus: Da li sam pravilno potrefio?

Jesi. Treba ti master server (server "connector" program ;). U većini komercijalnih multiplayer igara za PC se koristi GameSpy servis za match making, VOIP, IM, NAT, leaderboards, itd. U principu master server može biti samo MySQL baza u koju se registruju igre i igrači. Jedno polje u bazi treba da bude timestamp, koji će "živa" igra povremeno osvežavati. Tako da možeš da pošalješ upit koji će ti vratiti samo "žive" igre.
Citat:
Dark Icarus: I konačno, ima li neko kod nas (neki posrednik) ko se bavi ovim zavrzlamama, i kako je to u inostranstvu i koga da kontaktiram za to? Poimence, hoću neki server koji je fizički lociran u severnoj americi; da li to znači da sad sledi cimanje oko plaćanja preko kreditne kartice... itd.

Probaj SezamPRO. Mislim da je njihova ponuda mogućnosti i cene pristojna... Ustvari pitaj ovo u nekom drugom forumu, jer siguran sam ima onih što bolje znaju stanje sa hostingom u Srbiji.
Citat:
Dark Icarus: Npr. Da li postoji neki drugi direktan način na koji dve instance jedne aplikacije mogu da se pronađu na internetu bez predefinisanih IP lokacija??? Da li se preko DirectPlayLobby klase (koju do sada nisam koristio a čini mi se da radi nešto slično) ovaj problem može zaobići?

Ne znam ništa u vezi DP. Mada čak i kada imaš listu igrača i njihove adrese nisi rešio sve probleme. Npr. ako je server iza firewall-a (možeš da računaš da svi imaju firewall), igra mora da odradi NAT pregovaranje da bi se bilo ko zakačio na taj server.
[ bkaradzic @ 05.10.2005. 18:51 ] @
Citat:
Srki_82: Kako sa UDP paketima biti siguran da je klijent primio poslati paket? Ja sam radio tako sto sam sve pakete koje klijent MORA da primi slao preko TCP, a one koje bi klijent TREBAO, A NE MORA da primi slao preko UDP. Oni koji su mi bili bitni su bili pocetak i kraj kretanja, pocetak i kraj pucanja, a ostali (pocetak i kraj okretanja, gestures) sam slao preko UDP. Ne znam kako bih se samo oslonio na UDP. Ne verujem da je dobro resenje da klijent posle svakog primljenog paketa vraca serveru potvrdu da ga ja primio, zar ne?

Kada radiš sa UDP-om onda ne šalješ samo jedan paket nego šalješ isti paket recimo 5 sekundi ili sve dok ne dobiješ potvrdu od servera. TCP paket će sigurno stići do odredišta, ali putanja i vreme potrebno da stigne tamo nije garantovano brzinom tvoje konekcije. Zato se i koristi UDP, jer slanjem nekoliko stotina paketa ti povećavaš mogućnost da će neki od tih paketa stići na odredište u kratkom roku. Ako ne stigne u roku od 5 sekundi možeš da računaš da je igrač odustao od igranja i obavestiš ostale igrače o tome i izbaciš ga iz igre. Takođe u svakom paketu moraš da stavis broj paketa jer ni redosled slanja i primanja nije garantovan.
[ Srki_82 @ 05.10.2005. 20:28 ] @
Da li se put paketa kroz internet razlikuje za TCP i UDP paket? Sta odredjuje preko kojih cvorova ce ici koji paket?
[ bkaradzic @ 05.10.2005. 21:33 ] @
Citat:
Srki_82: Da li se put paketa kroz internet razlikuje za TCP i UDP paket?

Ne, osim da TCP paket garantovano stiže na odredište...
Citat:
Srki_82: Sta odredjuje preko kojih cvorova ce ici koji paket?

Packet switching
http://en.wikipedia.org/wiki/Packet_switching


[Ovu poruku je menjao bkaradzic dana 05.10.2005. u 22:35 GMT+1]
[ bkaradzic @ 06.10.2005. 07:23 ] @
Citat:
A free networking API that provides reliable UDP and high level networking constructs on Windows, Linux, and Unix

It allows any application to communicate with other applications that also use it, whether that be on the same computer, over a LAN, or over the internet. Although RakNet can be used for any networked application, it was developed specifically for rapid development of online games and the addition of multiplayer to single player games.

http://www.rakkarsoft.com/
[ Dark Icarus @ 13.10.2005. 11:03 ] @
Hvala, visla i bkaradzic, upravo su mi te informacije trebale...

Što se tiče peer-to-peer, nisam ja mislio BUKVALNO peer to peer, nego sam razmišljao iz moje ograničene programerske perspektive - ako programiraš u DirectPlayu imaš dve vrste programiranja, preko DirectPlayPeer objekta i DirectPlayServer/DirectPlayClient objekata. Ali ovaj drugi način je pogodan za MMORPGove, ne za RTSe (recimo da će moja igra biti najsličnija RTSu po network profilu); npr. klijenti ne mogu međusobno da komuniciraju (primer: privatni chat mora da ide preko servera!!!)

Ako idem preko Peer objekta, naravno da ću i u toj mreži da koristim client-server topografiju, (proglasiću peer sa najboljom konekcijom za "server") ali biće i slobodnog protoka podataka između klijenata. Plus, mislim da će igra imati vrlo mali footprint. Uostalom, to je i bilo prvo pitanje koje sam postavio na ovoj temi. Pa, idemo dalje... više nema ispita, sada se bacam na igru - uskoro ćete moći i sami da vidite rezultate vaših saveta.

Citat:
visla: pa ja sam cuo za neke strane agencije koje ti daju to sto hoces za 30$ mesecno
Aaaa! 30$ mesečno?! Ali igra će biti freeware! I znam da postoje freeware igre koje se međusobno "nalaze" po internetu. (Gate 88 pada na pamet...)

Ni to nije nikakva nerešiva enigma: malo guglanja i cimanja za rukave, i već ću naći neki beneficirani hosting.

Pozdrav!