Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: TCP vaiko UDP pelipalveluuni ?

Sivun loppuun

kpzpt [30.11.2010 14:03:10]

#

Pelipalvelu!

Kuinka joku kokenut netti vääntelijä kommentoisi tätä TCP UDP valintaa ?

Jos käyttelen UDP paketteja riittää kun asettaa 1 threadin jossa yksi socket joka lukea / kirjoittaa ! Mutta ajattelin asettaa kuitenkin kaiken kaikkiaansa 5 socket threadia joille jakaa liikenteen.

TCP socketeilla kuluisi RAM muistia paljon jo SEND ja RECV buffereihin, serversocket kun luo uusia socketteja jokaisella asiakkaalle ?

Olen päätynyt UDP pakettien käyttöön, vaikka moni sanoo vaan ei, tahtoisinkin nyt siis vielä kommentteja ennen kuin aloitan joulukuussa palvelin ohjelmistojen koodaukset !

nomic [30.11.2010 14:06:50]

#

Jos on tietoa, josta ei ole väliä, pääseekö data perille (video- tai äänivirrat esimerkiksi) niin udp on silloin ihan hyvä valinta ja tcp:tä ei siihen. Ja taas toisinpäin, jos on tietoa, joka pitää säilöä tai se on varmasti oltava kokonaista ilman että häviää matkalla niin tcp...

kpzpt [30.11.2010 14:16:06]

#

Muistin kulutus TCP kera !

Kuinka arvioitte tuon muistin tarpeen jos rakennan TCP kera nämä peli siirrot.
Minun linjani kykenee helposti palvelemaan 512 samanaikaista UDP kera, tämä TCP on paljon raskaampi mitä UDP, RAM ja CPU kohdalla koska serversocket jakaa eri socketeille asiakkaat.

--

Ajattelin nuo mitä mainitsit niin ohittaa tarkistus summalla UDP paketin jokaisen teksti rivin lopussa ja vielä koko paketin tarkistus summa paketin lopussa ja vielä niin että lähetän kaksi taikka kolme samanlaista UDP pakettia kerrallaansa.

--

Vieläkin epäilen että UDP on parempi minulle ?
Mitä muita kommentteja ?

ville-v [30.11.2010 18:58:42]

#

lainaus:

TCP socketeilla kuluisi RAM muistia paljon jo SEND ja RECV buffereihin, serversocket kun luo uusia socketteja jokaisella asiakkaalle ?

Tällä ei ole mitään merkitystä. Yhteen megatavuun mahtuu ainakin 100-150 socketia ja käytössäsi on varmasti yli 100 megaa.

lainaus:

tarkistus summalla UDP paketin jokaisen teksti rivin lopussa ja vielä koko paketin tarkistus summa paketin lopussa

Tässä vaiheessa pitää vielä lisätä toiminto joka pyytää asiakkaalta paketin uudestaan jos se on rikkinäinen.

lainaus:

vielä niin että lähetän kaksi taikka kolme samanlaista UDP pakettia kerrallaansa.

Tästä ei ole mitään hyötyä, koska kaikki kolmekin voivat kadota matkalla. Serveri pitää ohjelmoida niin että ei haittaa tuleeko jokin paketti perille vai ei. Jos jotain matkan varrelle jäänyttä pakettia tarvitaan, serverin pitää pyytää se asiakkaalta ennen kuin jatkaa.

Pelipalvelusi sisältää vain vuoropohjaisia pelejä, joten mielestäni UDP:stä ei ole etua. Lisäksi joudut rakentamaan oman virheenkorjauksen koska eihän peliä voi pelata niin että yksi vuoro jää tulematta kaikille pelaajille. Jos lähetät koko pelitilanteen joka vuorolla, kulutat paljon enemmän resursseja kuin mitä olet aikaisemmin voittanut käyttämällä UDP:tä. TCP on helpompi toteuttaa vaikka se voikin olla 50 millisekuntia hitaampi.

jalski [30.11.2010 21:33:47]

#

Hidas tempoisten vuoropohjaisten pelien ollessa kyseessä, kuten shakki. En usko muistinkäytön ja kuormituksen muodostuvan palvelimelle ongelmaksi tcp:tä käytettäessäkään.

Kokeilin piruuttani Infernolle joskus kokeeksi tekemälläni monisäikeisellä chat-serverillä ja reilulla sadalla chat-asiakkaalla, niin muistinkäyttö ja kuormitus oli olematon.

En ole useamman pelaajan peliserveri-ohjelmaa toteuttanut, mutta muutamassa tekemässäni client-server pelissä (shakki, ristinolla ja ansa) tcp-toteutus on toiminut hienosti.

kpzpt [01.12.2010 06:38:17]

#

Muistin kulutus !

Kuinka te säädätte nämä asiakkaitten / palvelimen TCP sokettien SEND ja RECV byte bufferit ?
Mitä arvoja käytättä ?

Entä millä tavoin te luette / kirjoitatte TCP soketteja, jonoissa vaiko eri threadeissa ?

jalski [01.12.2010 09:12:17]

#

Eiköhän tuo vastaanottopuskurin koko ole tapauskohtainen ja riippuu tarpeesta.

Itse esimerkiksi tuossa aiemmin mainitsemani Infernon chat-serverin tapauksessa palvelin jokaista asiakasta omassa säikeessään ja vastaanotto tapahtui aina tavu kerrallaan. Vastaanotettu tavu siirrettiin kolmen tavun mittaiseen puskuriin, jonka avulla muodostettiin vastaanotetusta datasta unicode-merkki. Tämä saatu merkki laitettiin aina dynaamisesti viestimerkkijonon perään. Tätä tehtiin kunnes vastaanotettiin rivinvaihto, jolloin viesti oli valmis. Jos viestimerkkijono kasvoi liian suureksi niin heitettiin sen sisältö yksinkertaisesti vain pois.

kpzpt [01.12.2010 14:38:29]

#

Static !

En tarkkaan tunne Java ohjelmointikieltä vaikka sitä olenkin päätynä käyttööni asettamaan.

Kuinka tämä static metodien ja luokkien käyttö, kuinka tämä tulisi ajatella, otanko käyttööni static asetuksen kun rakennan TCP sokettien luku ja kirjoituksia ja ainoastaan muuttujat sitten non static, eteenkin jos rakennan multi thread tyyliin, eli jokaiselle soketille oma säie ?


Sivun alkuun

Vastaus

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

Tietoa sivustosta