Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: JavaScript: JS ja floating numerot ?

HannuTapio [09.07.2018 12:20:11]

#

Hei,

Kuinka nämä desimaali luvut pyörivät javascript koodissa, eri selaimissa.

Minulla on nämä minun pilotit pelini valmistumassa netti peliin, mutta, desimaalien käytös on erillaista kuin olen odottanut.

Desimaalit tuntuvat käyttäytyvän eri tavalla eri selaimissa kun ajan kaksinpeliä.

Minulla on pilotit lautapeleissäni koodi runko joka työntää kaikkea grafiikkaa koko ajan eteenpäin, vain pelaajan toimet muuttavat grafiikan kulkua, kuitenkin peleihin tulee x ja y ja suunta arvoihin muutoksia, eri selaimissa.

Onko javascript desimaali kulku samanlaista eri selaimissa, vai onko niissä virheitä jotka ovat erillaisia, jotka ovat selain kohtaisia.

--

L2-K2 [10.07.2018 00:54:49]

#

Ongelman kuvaus ei ihan täysin aukenee, siis millä tavalla nuo luvut käyttäytyvät erilailla eri selaimissa? Mitä laskuoperaatioita teet niillä?

Periaatteessa eri selainten välillä ei pitäisi olla (mitään merkittäviä) eroja, koska (kaikki) javascript-koodin luvut ovat samoja järjestelmäsi natiiveja 64-bittisiä liukulukuja. Siis myös kokonaisluvut, mutta tämän toki huomaa vasta noin 15 merkkiä pitkien kokonaislukujen kohdalla.

Mutta, sitten palataan siihen, että miten tietokoneen liukuluvut ylipäätään toimivat, ja minkälaisia ominaisuuksia niiltä ei kannata odottaa. Mm. laskujärjestys voi vaikuttaa lopputulokseen, ja tämä voinee joskus poiketa selainten välillä, jos joku niistä päätyy optimoimaan koodia rankemmalla kädellä. (Liittyy tosiaan siihen, että yrittävätkö jotkut selaimet optimoida koodin nopeutta tietoisesti rikkoen IEEE 754 -standarditoteutusta.)

Tällöinkin erojen pitäisi toki olla hyvin, hyvin pieniä. Siis siellä 15. desimaalin ympärillä*. Eikä niiden pitäisi aiheuttaa mitään lopputuloksen kannalta oleellisia eroja (kunhan pelissä mallinnettava asia ei ole kaoottinen prosessi).

Olisiko sinulla esimerkiksi antaa niin sanottua pienintä ei-toimivaa koodiesimerkkiä missä kaksi selainta antaa eri vastauksen?

* Toki, jos lasket jonkin ”x ≈ 1, y = 1 – x” -tyyppisen laskun, niin toki suhteelliset erot voivat olla paljon suurempia. Siis, jos joku selain optimoi tuota niin pitkälle, että siitä numeerisesti kyseenalaisesta kohdasta päästään eroon.

HannuTapio [10.07.2018 02:39:01]

#

Floating points,

Kiitos kun vastasit, minä taidan epäillä että minun ongelmani olikin ennemmin cache joka oli eri selaimissa eri versiossa, kun testasin, minun ohjelmani toimivat tällä hetkellä sekä google että opera selaimien välillä, en aio itse testata kun ei se kunnolla ole mahdollistakaan, niin, ohjelmani toimivuutta, win ja lin ja mac selaimissa, olen vain linuxin kanssa liikenteessä.

Mutta, minun floating points menevät tällä hetkellä ihan ok.

Minulla oli vikana joko eri versiossa oleva cache taikka sitten parseFloat jota käytin, tuo parseFloat saattaa supistaa käytössä olevia desimaaleja hieman, en tarkkaan tunne kuinka toimii.

Mutta, minulla lähti toimimaan kaikki on synkroonissa, en tiedä mistä oli kyse kun ei ekalla yrittämällä taikka edes tokalla taikka kolmannella, mutta, nyt sitten toimii.

Kiitos, silti kun vastasit.

:)

--

HannuTapio [12.07.2018 20:35:05]

#

Desimaalit ja javascript,

Minä vielä hieman kirjaan näistä JS desimaaleista, minulla on siis nämä pilotit pelit, ja niissä on koodi joka vain työntää kaikkea grafiikkaa eteenpäin, aina samalla tavalla, vain pelaajan toimet muuttavat grafiikan kulkua.

Minulla oli aiemmin ongelmana että koneet eivät olleet synkroonissa, mutta, nyt sitten taas ovat olleet synkroonissa jo pari päivää.

Ongelmana on tällä hetkellä että savut eivät ole synkroonissa, vaikka niitä liikutetaan samalla tavalla kuin koneita ja ammuksia.

Tämä on jokin hauska bugi minulla, mutta, en tiedä mistä on kyse, ip1917 pelin savut eivät ole synkroonissa eri tietokoneitten välillä, mutta, taasen ammukset ja lentokoneet ovat.

Koodin kulku on käytännössä vain sin ja cos + ja - x ja y arvoihin.

Jotakin hauskaa bugia, yritän löytää.

--

groovyb [12.07.2018 22:13:29]

#

Veikkaanpa että jos tekisit synkronoinnin kuten aiemmin tässä toisessa keskustelussasi puhuttiin, asiat olisi synkronissa.

vanha viestini sinulle johon vastasit että et näe tarvetta synkronoinnille:

groovyb kirjoitti:

no jos et synkronoi lentokoneiden koordinaatteja pelaajille, eikö se vähän poissulje sitten useamman ihmisen pelaamista? jos pelaaja 2:sen lentokoneet on oikeasti muualla kuin missä ne näkyy pelaaja 1:sellä, eikö se hankaloita pelaamista varsinkin jos tätä pelaataan reaaliaikaisesti. Kyllä, sinun tulisi synkronoida pelitapahtuma, jos pelit eivät ole vuoropohjaisia.

Lopeta se ajastimilla pelleily ja tee asiat eventein kuten websockettia tulee käyttää. Muuten se on kuten perinteinen intervalleihin perustuva request/response pattern, eikä reaaliaikainen.

HannuTapio [12.07.2018 23:49:49]

#

Ajastin,

Aion rakentaa kaikki tulevat lautapelini tällä tick ajastimella, se on hyvä ja toimiva vaihtoehto, tämä siis, mikäli floating numerot menevät samalla tavalla kaikissa käyttöjärjestelmissä ja selaimissa.

Minulla millisekunnit jaetaan aina kahdeksalla, tämä tekee 125 ticksiä aina sekuntti, näitten mukaan sitten pelien kulkua työnnetään eteenpäin, ja vain pelaajien toimet muuttavat pelin kulkua, ei ole erillisiä random eventtejä.

Synkroonissa ja eventeissä on se huono puoli, että, aina välillä koneet eivät ole synkroonissa, eihän siinä muuten ole järkeä laittaa synkroonia, taasen tässä tick ajastimessa, on pyrkimys että koneet eivät milloinkaan ole pois synkroonista.

:)

--

Metabolix [15.07.2018 22:22:18]

#

groovyb kirjoitti:

Lopeta se ajastimilla pelleily ja tee asiat eventein kuten websockettia tulee käyttää.

Reaaliaikaista peliohjelmointia ei mielestäni voi tehdä pelkästään WebSockettien eventeillä.

Jos peliä pyörittävällä koneella ei ole ajastinta, peli ei toimi ollenkaan reaaliaikaisesti vaan etenee ainoastaan silloin, kun käyttäjältä tulee syötettä. Tämä sopii tietysti aivan hyvin oikeisiin lautapeleihin kuten shakkiin mutta ei sovi näihin Hannun ”lautapeleihin” kuten laudalla pelattaviin lentokoneräiskintäpeleihin.

Jos pelaajalla ei ole ajastinta vaan peli toimii palvelimelta tulevan tiedon mukaan, peli kulkee nykivästi, koska nettiyhteyden viive on vaihteleva. Lisäksi yleensä pelaajan pitää ilmoittaa palvelimelle, vaikka syötettä ei olisi, koska palvelimen on hyödyllistä erottaa viive ja passiivisuus.

Sujuvan lopputuloksen saamiseksi on oikein, että peliä ajetaan ajastimella tasaiseen tahtiin ja jollain keinolla vältetään verkkoviipeestä johtuva epätahtisuus ja nykiminen.

Jos pelillä on yksi selvä palvelin, helpointa on tietenkin lähettää kaikki syöte palvelimelle ja ajaa peliä täsmälleen sen mukaan, mitä palvelin ilmoittaa. Palvelin voi siis lähettää pelaajille säännöllisesti aikaleimoja ja ajantasaiset tiedot syötteistä. Syöte voidaan käsitellä heti, jos halutaan nopein reaktio, tai tietyn verran lähetysajasta jäljessä, jos halutaan ennustettava viive tai tasapuolinen viive kaikille pelaajille. Pelaajan koneella on selvintä näyttää tilanne sen mukaan, mitä palvelin on ehtinyt ilmoittaa.

Pelaaja voi myös pyörittää peliä hieman pienemmällä viipeellä oman parhaan tietonsa mukaan ja korjata virheet myöhemmin palvelimen ilmoittaman tiedon mukaan. Tämä vaatii enemmän työtä ja voi myös aiheuttaa hassuja tilanteita, jos vaikka pelaaja omasta mielestään onnistuu tuhoamaan vastustajan lentokoneen mutta hetken päästä kone palaakin lentoon vähän eri kohdassa.

Hajautetussa pelissä (ilman palvelinta) voidaan noudattaa samanlaisia periaatteita, mutta siinä pitää lisäksi päättää, kuka pelaajista on oikeassa, jos tiedot eivät täsmää, ja pitää myös miettiä huijaamisen ja hakkeroinnin mahdollisuutta.

Vastaus

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

Tietoa sivustosta