Miten tyhjennetään ruutu SDL:llä?
Ja miten selataan kansiot läpi C++:lla?
1. Ruutu tyhjennetään:
SDL_FillRect(pinta, NULL, SDL_MapRGB(pinta->format, RED, GREEN, BLUE));
2. Pienellä googletuksella: MSDN:n aihe
Jos halutaan ruutu suoraan mustaksi niin
SDL_FillRect(pinta, NULL, 0);
riittää. Optimoidaan sieltä se yksi funktiokutsu pois ;)
Hyvin toimii (niinku pitääkin). Toi tiedostojen selaus on kuitenkin tehty jotenkin turhan vaikeaksi verrattuna PHP:hen. Tässä on jonkinlaista tietoa dirent.h kirjaston käytöstä.
https://www.ohjelmointiputka.net/keskustelu/
Miten saan direntksi määritellyn tiedostonimen(?) chariksi?
Googlesta löytyi, että olisi d_name
struct dirent *joku; //... opendir() ... readdir() ... joku->d_name
(ei ole kokemusta direntin käytöstä)
/* print files in current directory in reverse order */ #include <dirent.h> main(){ struct dirent **namelist; int n; n = scandir(".", &namelist, 0, alphasort); if (n < 0) perror("scandir"); else { while(n--) { printf("%s\n", namelist[n]->d_name); free(namelist[n]); } free(namelist); } }
Minulla pieni lisäys tuohon ruudun tyhjentämiseen. Itse käytän tällaista koodia, joka on nopeampi kuin SDL_FillRect.
void ClearScreen(SDL_Surface *ruutu) { int i; if (SDL_LockSurface(ruutu) == 0) { Uint8 *pikselit; pikselit = (Uint8 *)ruutu->pixels; for (i = 0; i < ruutu->h; i = i + 1) { memset(pikselit, 0, ruutu->w*ruutu->format->BytesPerPixel); pikselit = pikselit + ruutu->pitch; } SDL_UnlockSurface(ruutu); } }
TGunner: onko tuosta jossain tilanteessa oikeasti hyötyäkin?
Ainakin itselläni -O2:lla käännettynä tuo koodisi ei tyhjentänyt 32-bittistä pintaa lainkaan nopeammin, ja 24-bittiselläkin aikaero jäi 1000:lla tyhjennyksellä noin 10ms:iin (yhteensä), joten vähän turhalta säädöltä tuntuu.
Sisuaski kirjoitti:
TGunner: onko tuosta jossain tilanteessa oikeasti hyötyäkin?
Ainakin itselläni -O2:lla käännettynä tuo koodisi ei tyhjentänyt 32-bittistä pintaa lainkaan nopeammin, ja 24-bittiselläkin aikaero jäi 1000:lla tyhjennyksellä noin 10ms:iin (yhteensä), joten vähän turhalta säädöltä tuntuu.
Minulla tuo osoittautui mittauksissani paljon nopeammaksi kuin muut menetelmät jota kokeilin (lukuunottaen SDL_FillRect:n).
TGunner, ihan turhaa kikkailua, turha silmukka ja kaikkea.
#define Tyhjenna(pinta) memset(pinta->pixels, 0, (pinta->h - 1) * pinta->pitch + pinta->w * pinta->format->BytesPerPixel)
Tuohon vielä ne lukitustarkistukset, niin johan on täydellinen tapa.
On tuolle SDL:n omalle funktiollekin kyllä tiettyjä perusteita, kuten se, että jos käyttäjällä on SDL:stä jokin laitteistoa hyödyntävä versio (DirectDraw tms), tällaiset kikkailut voivat tosissaan hidastaa ohjelmaa, jos kuva aivan turhaan siirretään näyttömuistista keskusmuistiin ja takaisin tyhjennystä varten.
Aihe on jo aika vanha, joten et voi enää vastata siihen.