Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL_NET ja monta pelaajaa

Sivun loppuun

Taikaviitta [26.12.2006 19:17:08]

#

Heipä hei lapsoset.

Teen nettipeliä, joka luonnollisesti tulee olemaan nätimpi kuin oblivion ja keräämään enemmän pelaajia kuin WoW.

Eteeni tuli matkalla kuitenkin yksi pieni ongelma. Verkkokoodi toimii kahdella pelaajalla loistavasti ja nopeasti jopa maapallon toiselle puolelle saakka imutukset päällä (testattu), mutta heti kun pelaajia on enemmän kuin kaksi (kolme) yhteys rupee pätkimään armottomasti. Osaisikohan kukaan ehdottaa mahdollisia ratkaisuvaihtoehtoja ongelman ratkaisemiseksi?

Teknistä tietoa: (Oletuksena kolme pelaajaa)

Käytössä on UDP. Molemmat pelaajat lähettävät hostille pienen paketin, ja hosti lähettää heille myös pienen paketin.
Hostin yhteys alustetaan: SDLNet_ResolveHost(&ip, 0, 9999);
Muiden: SDLNet_ResolveHost(&ip, "(Hostin ip)", 9999);

Paketti lähetetään: SDLNet_UDP_Send(udpsock, -1, pack1);

Metabolix [26.12.2006 20:47:48]

#

Aika niukasti annoit tietoja. Mikähän mahtaa olla tämän paketin sisältö? Millaisesta pätkimisestä on kysymys, kuinka tätä on debugattu, mikä vaikuttaisi olevan siis tarkemmin ongelmana?

Luulisin, että viestintään pitää liittää jonkinlainen ajastussysteemi sen mukaan, mikä on hitain arvioitu paketin kuljetusaika, jotta paketin sisältämä tapahtuma tapahtuu kaikilla yhtäaikaa. Näin luullakseni toimii ainakin StarCraft. Toisaalta ajastus voi tapahtua jo pelaajan puolella, mutta minun päässäni siitä ainakin tulee paljon mutkikkaampi systeemi. Voi toki olla, että käytät jotakin muuta toteutustapaa, johon minun ajatukseni ei sovi alkuunkaan, ja luultavasti olen aika pahasti jäljessä nykyajan toimintatavoista. :P

Taikaviitta [26.12.2006 21:03:45]

#

Paketti siis on merkkijono, joka sisältää clienteille 7 merkkiä ja hostilla 20 merkkiä. Sisältää pelaajien koordinaatit.

Tätä lähetellään niin usein kuin mahdollista. Tarkotuksena ei ole, että jokaisen paketin olisi mentävä perille.

Ongelma on nyt se, että kun paketti lähetetään useammalle kuin yhdelle pelaajalle, homma alkaa pätkimään (hirveä lagi). Tämän ei pitäisi johtua paketin koosta tai nettiyhteyksien hitaudesta.

Joku SDL_Netin paremmin tunteva voisi selventää, onko paketit oletuksena jotenkin järjestelty tai vastaavaa, joka saattaisi hidastaa prosessia.

mikeful [26.12.2006 21:12:31]

#

Miten datan vastaanotto ja lähetys on toteutettu? Jossain kohtaa ohjelmaasi ekhä odotetaan datan tuloa liian pitkään. Tarkista ohjelmasi tästäkin kulmasta?

Taikaviitta [26.12.2006 21:28:26]

#

Paketit vastaanotetaan: if (SDLNet_UDP_Recv(udpsock, pack1)){...

Niitä ei kuitenkaan jäädä odottelemaan, vaikka ei tulisikaan.

koo [26.12.2006 22:04:43]

#

Saisiko tästä pulmasta tarkempaa kuvausta, jotenkin että hosti hommaa udp-socketin, bindaa sen johonkin, ryhtyy lähettämään sille ja sille clientille; client hommaa udp-socketin, lähettää sinne ja tänne, kuuntelee sieltä ja täältä... Ei meinaan nuo pari funktiota vielä sano mitään, niissä kun ei ole mitään varoituslappua päällä sanomassa, että nämä funktiot ei toimi.

Mutta näin pystymettästä sanoisin, että vika on tässä:

Taikaviitta kirjoitti:

Tätä lähetellään niin usein kuin mahdollista.

UDP ei ole luotettava protokolla, pakettien saapumisjärjestystä eikä edes perillemenoa ei takaa mikään ja tämä on ihan suunniteltu juttu. Floodaat siirtotien täyteen paketteja ja joku palikka välissä tuumaa, että tuleepas jostain ihan mahdottomasti UDP-palvelunestospämmiä, heittelenpä enimmät mäkeen, ettei mene kaikki intternetin puskurit täyteen ja hehku kaikki maailman piuhat ruuhkanpunaisina.

Toisaalta, eihän tässä edes pitäisi olla mitään ongelmaa, koska

Taikaviitta kirjoitti:

Tarkotuksena ei ole, että jokaisen paketin olisi mentävä perille.

Nyt vaan sattuu saamaan sitä mitä tilaa.

anttipanda [28.12.2006 12:00:48]

#

Ongelma voi olla niinkin syvällä kuin valitsemassasi verkkopeliarkkitehtuurissa. Koska en tiedä tarkemmin, höpötänpäs vähäsen:

Synkronoitu verkkopeli on huono idea, eikä sitä enää yleensä käytetäkään. Kaikkien clienttien ei tarvitse saada samaa tietoa samaan aikaan, eikä kaikkea tietoa tarvitse jakaa joka clientille. Hitaammat koneet hidastaisivat nopeampia turhaan.

Jokainen client lähettää serverille oman tilansa sen muuttuessa (jokaisella peliloopin kierroksella?), ja hakee serveriltä päivityspaketin pelimaailman tilaan. Monoliittisessa client/server -arkkitehtuurissa lähetetään koko pelimaailman tai osamaailman tila kerralla clientille, mikä sopii ihan hyvin suht pieniin peleihin.

Tämä rasittaa kuitenkin suuremmissa peleissä verkkoa, ja siksi kannattaakin toteuttaa tsydeemi, jolla voidaan lähettää vain tarvittava tieto clienteille. Lisäksi clientit voivat ennustaa muiden peliobjektien liikeratoja ja tulevia tiloja, ja korjata niitä tarvittaessa. Näin saadaan sujuva pelikokemus.

Taikaviitta [28.12.2006 14:37:31]

#

Tarvitsisin nyt neuvoa joltain SDL_netin tuntevalta...

Mikä on järkevin tapa heitellä pelaajat eri kanaville, ettei hostin tarvitse lähettää kaikkea roinaa jokaiselle pelaajalle samalla kertaa?

En täysin ymmärrä tuota UDP_Bind-komentoa. Voisiko joku selventää miten sitä käytetään? Samoin ResolveIP:n käyttötarkoitus on hämärän peitossa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta