Kuten nimestä voi jo päätellä, mietin tässä, että kumpi olisi parempi vaihtoehto, sillä teen vb:llä mmorpg:tä ja se toimii jo varsin mallikkaasti (vaikka taisteluosio puuttuu) ja kun meillä oli parin kaverin kanssa beta-testit tuossa, huomattiin, että lagi on turhankin suuri(0.2~06sek).
Eli miten voisin optimoida koodia ja asetuksia niin, että lagia saa pienennettyä.
Tällä hetkellä tiedot lähetetään tyyliin:
'liikkuminen winsock1.sendata "move|x|y|mapx|mapy|index|nimi"
Ja serveri kun saa tuon tiedon, lähettää se tiedon eteenpäin samassa mapissa oleville. (eräänlainen pieni tietokanta ja sisäverkossa se ei tuota lagia)
Eli mitä alan optimoimaan ja muuttamaan, jotta saisin lagin pienennettyä?
Lagiin saattaa kyllä sekin vaikuttaa, että kaveri, jonka kanssa testailtiin asuu ruotsissa, mutta toisen kaverin kanssa, joka asuu reilusti lähempänä, oli samanlaista lagia. Tässä herää kysymys, että onko nytten tarve alkaa käyttää UDP:tä ja kuinka kannattavaa se on (inhottaa jos jonkin tärkeä tapahtuma hukkuukin paketista).
Kiitokset kaikille, jotka voisivat antaa optimointivinkkejä. :)
Edit:
Jatketaan vielä sen verran, että taidan tarvita apua täältä enemmänkin. Itse pystyn hoitaa varmaankin tuon ohjelmoinnin loppuun asti, mutta tulevien kuukausien aikana taidan tarvita beta-testaajia ja graafikkoja. Itse olen jo niin sokea projektille, että en löydä siitä bugeja, koska toimin aina "oikein" ja minun graafiset taidot - tyrmistyttävän huonot. Pitäisi piirtää "korteille" ikonit, ja tällä hetkellä niitä on 90 kappaletta ja päälle sitten tilemappia pitäisi laajentaa, nytten siinä on vain nurmikkoa, kiveä ja yksi hahmo.
Tässä vielä kuva projektista:
http://koshiyoka.biz/nomic/gfx/tow.JPG
Moottori on jo puolilleen valmis, mutta paljon puuttuu vielä.
Lagiin lienee useampikin syy, yksi ehkä se että tuo winsock kontrolli ei kovin tehokas ole. TCP protokolla on kyllä mielestäni tuossa tilanteessa ihan toimiva. Vaikka UDP protokolla olisikin tehokkaampi vaatii se erittäin paljon monimutkaisemman lähestymistavan.
Kiinnostaisi tietää mitä teet paketille kun se saapuu serverille, eli lähettäänkö se tarpeeksi nopeasti eteenpäni. Lisäksi se että miten paketti luetaan client päässä, kuinka nopeasti se näkyy ruudulla oikeasti. Ja jos pelaajia on useampi, onko yhessä paketissa vain yhden pelaajan tiedot? Yhteen pakettiin kun kannattaisi pyrkiä saamaan mahdollisimman paljon tietoa.
Kokeilin tuota UDP:tä, mutta en osaa sitä oikein käyttää kunnolla.
Serverille kun saapuu paketti, tarkastetaan ensiksi, että missä mapissa tämä kyseinen client on ja tieto lähetetään tässä mapissa oleville (tätä varten loin pienen tietokannan), eli tietoa ei lähetetä kaikille, jotka ovat samassa serverissä kiinni. Aina kun jotain tapahtuu, tai tehdään, viedään tieto ensiksi serverille ja serveri vastaa takaisin kyseiselle clientille ja vasta silloin client saa tietonsa. Esimerkiksi: Liikutaan askel vasemmalle -> viedään tieto serverille, joka jakaa tiedon sitten kaikille, samassa mapissa oleville.
Yhdessä paketissa on aina yhden pelaajan tiedot. Toki voisin kokeilla semmoista, että kerätään tietoa pelaajista ja vaikka sekunnin jälkeen lähetetään kaikki saadut tiedot clienteille. Koitan pitää paketteja pieninä (paitsi kun kirjaudutaan sisälle, jolloinka tietoa tulee jo aika paljon, tai kun tarkastetaan inventori)
Voikohan se myös hidastaa, että minulla on tuolla DataArrival-subin sisällä DoEvents-käsky? Yhteydestä se ei ainaskaan taida olla kiinni, koska paketit on niin pieniä, etteivät ne kuormita verkkoa juurilainkaan.
Tuo DataArrival minä juuri kiinnosta. Ei siellä minusta Doeventsia saisi olla, se subi pitäisi olla melko yksinkertainen joka vain merkkaa saapuneet tiedot oikeaan paikkaan, ei muuta. Ja ymmärsinkö oikein että kun liikut, menee tieto serverille mutta toiselle pelaajalla tieto sinun likkumisesta ei mene ennekuin toinen pelaaja ITSE liikkuu?
Juu, kokeilen ottaa doeventsin pois, jos se siitä lähtisi. :)
Tuo liikkuminen tapahtuu näin: clien1 lähettää tiedon, että nyt liikutaan -> serveri saa tiedon ja tarkistaa missä mapissa ollaan(kulkee move-tiedon mukana tuot tieto), etsii kannasta clientit, jotka ovat samassa mapissa ja lähettää näille tämän tiedon -> samainen client saa myös tämän tiedon ja sen näkyy sitten hänelläkin.
Olen myös miettinyt semmoista vaihtoehtoa, että kun painetaan nappia ja liikutaan, näytetään meillä heti liikkuminen ja samassa lähetetään tieto serverille, joka jakaa tiedon kaikille muille, paitsi tälle, joka jo liikkui.
Olen taas vaikeaselkoinen. T_T
nomic kirjoitti:
Olen myös miettinyt semmoista vaihtoehtoa, että kun painetaan nappia ja liikutaan, näytetään meillä heti liikkuminen ja samassa lähetetään tieto serverille, joka jakaa tiedon kaikille muille, paitsi tälle, joka jo liikkui.
Juuri noin se PITÄÄKIN tehdä. Muuten oma liikkumien on väkisinkin lagisen tuntuista vaikka ping olisi pieni. (kaikki pelit tehdään noin) Toki serverillä voi sitten olla tarkistuksia että oliko siirto sallittu. (lisäksi osuiko pelaajaan edellisessä ruudussa vaikka "omasta" mielestä pelaaja oli jo siirtynyt jne.)
Aihe on jo aika vanha, joten et voi enää vastata siihen.