Eli minulla etsitään nyt liian suurta data lastia tietokannasta.
Sain vihdoin kartta generaattorin mikä tekee noin 10minuutissa
(-500 | -500) - (500 | 500)
tuon kokoisen kartan. Tietokannan koko on kuitenkin 15mt mikä on reilusti yli sallitun. Maksimissaan kerralla voidaan lukea reilusti vähemmän ymmärtääkseni.
Tai ainakin erroriksi sain:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 73 bytes)
Nyt olen miettinyt mikä olisi paras tapa saada laskettua vain osa tuosta.
Olisiko taulukkoihin tallentaminen järkevä vaihtoehto? Onko mitään muita hyviä vinkkejä jolla esim tietokantaa voisi saada pienemmäksi ilman, että karttaa piennennetään?
Varoitus puhuu kyllä 64 megatavusta.
Mitähän tuo 1000x1000 taulukkosi pitää sisällään? 67 tavua on melko suuri alkion koko.
Jos tietokannan koon pitäisi olla 15 megatavua ja sitä tarvii kokoajan latailla palvelimelta, niin pelissäsi on vakava suunnitteluvirhe.
No kerrotko minulle miten voin toteuttaa pelin maailman (kartan) niin, että sitä ei latailla kokoaikaa silti se tietää mitä haetaan missäkin kohtaa.
Alkiossa on Data(eli id), x, y, KylanNimi, Asukkaita, Omistaja, KaivosVero, KultaVero, Kivi resurssi, rauta resurssi, villa resurssi, puu resursse, timantti resurssi, HyökkäysBonus, PuolustusBonus, Eri rakennusten tasot joita on 8kpl. Joten kyllä siitä tulee helposti yhden rivin kooksi 67tavua.
Sulla kannattaa olla erikseen taulukko rakennuksille ja asukkaille, koska pelimaailmassa on aina valtavan paljon enemmän tilaa kuin pelaaja käyttää. Lisäks tuostahan tulis armottoman hidas jos kävisit pelin joka ruudun läpi kun noita laskeskelet pelin aikana. Maan sisäiset resurssit (rauta, hiili jne) voi ehkä vielä olla noissa alkioissa mukana. Et myöskään tarvitse tallentaa X ja Y koordinaatteja koska tiedäthän jo taulukon indeksistä missä ne on.
Riippuu paljonko puita on, yhden tavun (0..255) verran puu voi viedä tilaa, esim kertoen minkä kokoinen puu on. 0 meinais ettei puuta ole ollenkaan.
Voit tiivistää tietoa huomattavasti: harvinaiset tiedot kannattaa tallentaa erikseen (kuten kylän nimi ja rakennukset, ellei joka ruudussa ole kylää), resurssit voi ehkä ilmaista kahdella kentällä (tyyppi ja määrä) nykyisten viiden sijaan jne.
SQL-kanta vaikuttaa joka tapauksessa hyvin epäkäytännölliseltä tietorakenteelta tällaiseen, ja ainakaan sieltä ei kannata jatkuvasti ladata koko kartaa vaan vain tarpeelliset osat. Suunnittele siis pelisi paremmin.
Eli voisinko toteutttaa asian niin, että kun peli käynnistetään ladataan javascriptillä esim istuntoon tai johonkin evästeeseen kartasta noin 20x20 alue. Jolloin pelaajan tullessa karttaan hän voi hieman selata karttaa paikasta toiseen ja jos hän menee ylitse tuon 20x20 alueen ladataan hieman lisää ruutuja näkyviin?
Toivottavasti ymmärsitte mitä ajan takaa.
Voit hyvinkin toteuttaa noin. Aika tyypillinen tapa itse asiassa, tosin yleensä kannattaa laittaa lataus käyntiin jo käyttäjän lähestyessä reunaa, niin ei tarvitse odotella reunan yli mennessä.
Selaimen päässä tallentaminen kannattanee tehdä localstorageen. Localstorage on oletuksena rajoitettu noin viiteen megaan per sivusto, joten kannattanee sitten myös välillä poistaa dataa esim. vanhimmasta päästä.
Toimiva yksinkertainen ratkaisu voisi olla että tietokannassa olevasta kartasta tehdään phpllä data tiedosto kerran, jossa tiedosto sisältää vain sen mitä kartassa näkyy eli yksi BYTE per koordinaatti(eli indeksi). Jos kartta visuaalisesti tietokannassa muuttuu, niin sitten päivitettäisiin tähän kartan data tiedostoon tuo yksi kohta.
Kartan lukeminen täten olisi varmaan huomattavasti nopeampaa, kun tietokantaan ei tarvitsisi koskea vain liikkuessa kartalla.
Lukeminen sitten tapahtuisi ajax -kutsuilla LocalStorageen(tai sessionStorageen).
Data tiedoston koko olisi noin 7,6 Mb, joten siitä voitaisiin ladatakkin suurempia palikoita muistiin kerralla ennenkuin tarvitsee ladata sitä uudestaan. Tosiaan kartan mahdolliset päivitykset pitäisi ottaa huomioon. LO/HI Byte kikkailulla tiedosto koon saisi varmaan puolitettua viellä ja ladattua kokonaan muistiin. Yhden Byten sisältäessä 2 seuraavaa ruutua tietoa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.