Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Useampi kuin yksi pelaaja linjalla ja lag ?

Sivun loppuun

HannuTapio [17.02.2022 20:37:45]

#

Edit.
Minä vahingossa kirjoitin javascript, mutta, tämä on siis javascript websocketit ja sitten java palvelinohjelma, eli kaksi kieltä kysymyksessäni.

Hei,

Minulla on nämä minun www.lautapelimestari.com sivustoni, minulla on tällä hetkellä ongelmana, tuo minun bonuspelini, niin, hiekkaset tämä on idea olla kevyt luolalentely, en ihan vielä ole valinna kuinka monta pelaajaa voi samaan aikaan olla, mutta, arvioin että valikoin jotain 8 - 16 väliltä.

Minulla on nämä minun lautapelini tällä hetkellä, niin, linjapeleinä, ja niitä voi kaksi ihmistä pelata omilla tietokoneillaansa samaan aikaan.

Minulla on ongelma, että, olen harrastelija ja en ihan tunne mitä kaikkea tcp linja koodia voin käyttää vapaasti, mitkä on sallittua minulle ja mitkä ei.

Minun koodini on tällä hetkellä rakennettuna seuraavanlaisesti -

Peli käy..
Kello käy..
JS ohjelman kulku 0.2 sekunnin välein antaa kaikille pelaajille luvan pelata 2 sekunttia eteenpäin.
JS ohjelman kulku määrää pelaajien siirrot tapahtuviksi 2.5 sekunnin kuluttua. ( IS1917 ja MS2312).
JS ohjelman kulku valikoi kaikkien saapuneitten lupien joukosta alimmaisen ja tahdistaa sen mukaan kaikki pelaajat, ja sitten taas antaa luvan mennä kaksi sekunttia eteenpäin.
JS ohjelman kulku sitten vielä tahdistaa peli kelloa saapuneitten pelilupien mukaan, että, kukaan ei mene yli alimmasta luvasta.

--

Ongelmana on että, kun joku pelaaja on lagissa, eli vaikkapa määrittelee optioissa, pelin värejä uusiksi, tämä kestää yli kaksi sekunttia laudan kohdalla, eli, pelaaja ei tällöin ole lähettämässä tätä lupaa mennä eteenpäin, ja on lag.

Kuinka minä voisin rakentaa helpoimman ja yleisesti käytetyimmän tavan pelata hiekkaset bonuspeliäni, ( luolalentely ), niin, että, pelaajat eivät "nyi" ruudulla tai "hypi", minun tämän hetken koodi laittaa kaikki pelaajat aina odottamaan sitä hitainta.

Kuinka synkronointi ja muut kivat mitä en tiedä vielä.

Kuinka rakentaa helppo ja yleinen tcp linja rutiini luolalentelyyn jossa on 8 - 16 pelaajaa ja näppäin viive, ennen, kuin siirto tapahtuu on 150 ms. ( peli testaaminen vielä ratkaisee lopullisen ms valinnan ).

Kiitosta taas, olisi mukava jos joku edes vähän kommentoisi, kyllä minä kuuntelen teidän neuvojanne, vaikka, en aina niitä noudata, on minulla tämä oma elämä silti, niin, en ihan aina voi kaikkia kirjattuja kuunnella, on minulla tällä hetkellä toimiva sivu, joka ei ole teidän neuvoillanne kokonaansa rakennettuna, vaan omilla valinnoilla, ja näin on ihan hyvä.

:) :) :)

--

Metabolix [17.02.2022 21:06:07]

#

Yleensä ratkaisu on se, että peli etenee jatkuvasti. Eli pelaajat eivät anna lupaa pelin jatkumiseen, vaan palvelin antaa sen luvan kaikille, vaikka joku olisi valikossa. Pelaajien siirrot kirjataan tapahtuneiksi silloin, kun ne saapuvat palvelimelle. Jos pelaaja on valikossa tai muuten vain lagaa, siitä kärsii vain pelaaja itse. Peli pyörii silti tasaisesti. Lagaava pelaaja toimii aivan kuin hän olisi mukana mutta ei ohjaisi peliä ollenkaan.

HannuTapio [17.02.2022 21:11:34]

#

Lag,

En tiedä osasinko oikein ajatella tuon, kiitosta kuitenkin, entä tämä tilanne, kun, pelaajan siirto täytyy tapahtua 150 ms sisään, kun tuo näppäinohjaus reagoi, sen jälkeen siirtoon, tämä siirto pitää jokaiselle siirtää ja ottaa sitten peliin mukaan.

Kuinka minä synkronisoin, pelaajien tilanteen, lähetänkö palvelimesta jonkin kohde ajan, vaikka 1 kertaa sekunnissa ja sen ympärille rakennan siirrot, ja sitten jos palvelimessa näkyy että siirto on jollekkin liian myöhässä, niin, se hylätään kaikilta.

En tällä hetkellä osaa ajatella tuota, pelaajan näppäinten siirtämistä jokaiselle pelaajalle, niin, 150 ms mukaan, kaikki täytyy ehtiä mukaan.

Minulla jokin tarkka sync täytyy olla kellossa tällöin pelin jatkuvassa kulussa ja sitten palvelimessa tarkistus, että, kaikki ehtivät mukaan.

Tämä on kyllä hurjaa ajatella, ihan näin tiivistä tapahtumaa, kuin 150 ms sisään 16 pelaajaa tai jotain noin.

Minä en vain osaa vielä ajatella, ihan koko pakettia, tuo sinun viestisi taitaa sisältää aika tarkasti kaikki.

:) :) :)

--

Metabolix [17.02.2022 22:11:08]

#

Et voi tehdä systeemiä, jossa kaikki ehtivät aina tietyssä aikarajassa mukaan. Eli tietenkin jos haluat tasoittaa tilannetta ja laittaa kaikille vähintään 150 ms lagin, niin tämän voit tehdä (eli pelaaja lähettää siirron ja ajan, ja palvelin ottaa siirron mukaan vasta ajalle +150 ms), mutta jos pelaajan netti pätkii, niin silloin pelaajan siirto voi olla myöhässä vaikka 250 ms tai vaikka 12345 ms, ja kannattaa ottaa siirto mukaan heti.

Kun ehkä ymmärrät koodia paremmin, niin koodina pitäisi tehdä palvelimella näin:

siirto = pelaajalta_saapunut_siirto;
aika_jos_ajoissa = siirto.lähetysaika + 150 ms;
aika_jos_myöhässä = palvelin.oikea_aika;
aika_peliin_mukaan = max(aika_jos_ajoissa, aika_jos_myöhässä);

HannuTapio [17.02.2022 23:33:59]

#

Lagia,

Kiitos, minä rakennan jotain omaa, tämän sinun ja minun aikaisemman perusteella, minä sitten laitan viestin kun valmistuu.

Minä rakennan seuraavan.

8 - 16 pelaajaa maksimi.
Kun pelaajat pelaavat peliä omilla tietokoneillaansa, niin, näppäin toiminta tapahtuu 150 ms päästä painetusta näppäimestä, jotta, kaikki pysyy samassa ajassa, jää 50 ms paketin siirtoon edestakaisin kaikille ja sitten 100 ms kaikkeen palvelimen ja asiakasohjelman kulkuun ja grafiikan piirtoon ruudulle.

Pyrin että kaikki on jouhevaa ja sulavaa, yritän rakentaa toiminnan ilman mitään lagia.

Lisäystä.
Tämä taitaisi olla helpompaa udp datagrammien kanssa, on houkutus tehdä vain java + lwjgl versiot "hiekkaset" luolalentelystäni, tässä socketissa on se huono puoli, että, se siirtää datan kirjoitus järjestyksessä, ja jos jokin sitten kestää, niin, se viivästyttää kaikkea tulossa olevaa.

:) :) :)

--

Lebe80 [18.02.2022 08:36:22]

#

Mistä sä tiedät, että nämä 150ms päässä tapahtuvat ovat kaikki synkassa keskenään?

Mitä tapahtuu, jos tieto on tullut myöhässä? Evätäänkö vain siirto? Miten se näkyy pelaajalle itselleen, ja miten se näkyy muille? Meneekö peli silloin pelaajalta itseltään epäsynkkaan muiden kanssa vai miten?

jalski [18.02.2022 11:15:59]

#

HannuTapio kirjoitti:

Tämä taitaisi olla helpompaa udp datagrammien kanssa, on houkutus tehdä vain java + lwjgl versiot "hiekkaset" luolalentelystäni, tässä socketissa on se huono puoli, että, se siirtää datan kirjoitus järjestyksessä, ja jos jokin sitten kestää, niin, se viivästyttää kaikkea tulossa olevaa.

Reaaliaikaiseen peliin UDP olisi varmasti parempi, mutta tarvitsee kyllä sitten myös kunnolla mietityn toteutuksen koska mikäänhän ei takaa paketin perille tuloa tai sitä, että paketit tulevat järjestyksessä...

HannuTapio [18.02.2022 15:10:16]

#

Lebe80,

Kiitos Lebe, sinä osasit rakentaa lauseeni paremmin, mitä minä.

Juuri näin minä ihmettelen.

Mutta, on jo vähän selkeämpää, kun olen vähän miettinyt.

Kiitos, nämä socket kiemurat on aika moisia, kun 150 ms sisään pitää 16 pelaajan sync ja näppäin painallukset ja kaikki grafiikan piirrot ja palvelin ja asiakas ohjelman updatet.

Minä uskon että saan hienon kokemuksen kun säätelen nämä netti rutiinit valmiiksi ja peliin.

:) :) :)

--


Sivun alkuun

Vastaus

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

Tietoa sivustosta