Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Typerä piirtokysymys

Sivun loppuun

DumTom [09.12.2008 21:03:29]

#

Tässä olen nyt pari tuntia opiskellut SDL;ää.
Jos mulla on suuri pelialue short Area[6400*4800] ja näytön resoluutio on 640x480.
Kuinka voin piirtää pixeli kerrallaan viipaleen Area:sta näytölle?
Siis 640x480 viipaleen?
BlitzBasicissa loppui tehot moista kokeiltaessa.

petrinm [09.12.2008 22:01:00]

#

short Area[6400*4800];

unsigned int xa = 100; // Aloitus piste
unsigned int ya = 100;

for(unsigned int i = 0; i < 640; i++) {
    for(unsigned int j = 0; j < 480; j++) {
        // PiirraPikseli(NäytönX, NäytönY, Väri)
        PiirraPixeli(i, j, Area[6400*(ya+j)+xa+i]);
    }
}

Tehon puute voi johtua siitä että tuo 6400x4800 taulu on aikas iso. Kaikkiaan se vie vähän yli sata megatavua muistia! Lisäksi pikselien piirto yksikerrallaan on aikas hidasta.

DumTom [09.12.2008 22:04:03]

#

petrinm,ton minäkin osaan tehdä.
Ainoa vaikeus tossa hommassa on just toi PiirraPixeli.
Se tehtynä sdl:ää tukien piristäis.
Mietin tässä että jos se 6400*4800 ois kans surface niin voiskohan käyttää jotain surfacecopyä näytölle...
Lisää vastauksia ja viisauksia odotellen...:)

petrinm [09.12.2008 22:17:52]

#

Jos haluat vielä pikselin piirtofuntiota niin tässä on yksi, jonka pikaisesti löysin:

void setpixel(SDL_Surface *screen, int x, int y, Uint8 r, Uint8 g, Uint8 b)
{
    Uint32 *pixmem32;
    Uint32 colour;
    colour = SDL_MapRGB( screen->format, r, g, b );
    pixmem32 = (Uint32*) screen->pixels  + y + x;
    *pixmem32 = colour;
}

On kyllä huomattavasti parempi tapa käyttää SDL:n Sufacee, koska se lataa kuvan näytönohjaimen muistiin jolloin sen käsittely ja piirtäminen nopeutuu huomattavasti.

Spongi [09.12.2008 23:32:21]

#

Meneekö tuo y:n määrittäminen varmasti suoraan noin?

DumTom [10.12.2008 00:16:21]

#

Pitäis kai olla +y*640+x?

Spongi [10.12.2008 00:26:49]

#

En itse paljoa perus SDL:n piirtohommeleita ole käyttänyt, mutta käsittäisin että tuo rivi pitäisi olla muodossa

pixmem32 = (Uint32*) screen->pixels + y*screen->pitch + x;

SDL_Surfacen pitch tietääkseni kertoo suoraan pikseleiden vaatiman tilan yhdellä rivillä tjsp.

tkok [10.12.2008 15:35:12]

#

Keskustelua yhden pikselin piirtämisestä:
https://www.ohjelmointiputka.net/keskustelu/9922-yksi-vaivainen-pikseli

os [10.12.2008 17:12:44]

#

Kannattaa vakavasti harkita muita vaihtoehtoja kuin suoraa kuvamuotoista tallennusta, jos pelialue on noin iso. Tiilipohjainen grafiikka on yleisesti käytetty, helpohko ratkaisu. Kuvan jakamista useampaan osaan sekä SDL:n tukemaa RLE-pakattujen kuvien blittaamista kannattaa myös puntaroida.

Grez [10.12.2008 17:22:14]

#

os kirjoitti:

Tiilipohjainen

Brick based?

Tile on suomeksi laatta.

Jos pelialue ei rakennu toistuvista paloista, niin hajottaisin sen varmaan pienempiin osiin jotka pakattaisiin sopivalla pakkausformaatilla. Sitten niitä ladattaisiin taustathreadissa muistiin niin että muistissa on aina valmiina purettuna näytön ulkopuolelta esim. yhden osan verran joka suuntaan (ettei peli nykäise kun siirrytään ennestään lataamattomaan osaan).

Tosin, nykykoneilla ketään tuskin kiinnostaa jos peli vie 100 megaa muistia.

User137 [10.12.2008 20:46:08]

#

Jos tässä haetaan peliä joka muistuttaa esim Worms, Liero, Wings jne tyylistä hajoavaa maastoa niin 100 megaa on kyllä aika kohtuuton vaatimus. Kannattaa rajata pelialuetta esim max 3000x2000 kokoon tai skaalata vain kartta, ei pelaajia, kaksinkertaiseksi piirrettäessä. Tarpeesta riippuen en itse pakkaisi ulkopuolisia alueita sillä en haluaisi sulkea pois nättejä aseita jotka läjäyttää sirpaleensa koko kartan alueelle. SDL kai tukee 256 värisiä pikseleitä jos vielä haluaa optimoida.

Voit käyttää kokonäytön grafiikkatilaa jonka voit rajoittaa esim 1024x768 maksimiin. Suuretkin näytöt kyllä skaalaa sen sopivaksi.


Sivun alkuun

Vastaus

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

Tietoa sivustosta