Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ruudun tyhjentäminen SDL

Sivun loppuun

temu92 [13.09.2006 15:16:31]

#

Miten tyhjennetään ruutu SDL:llä?
Ja miten selataan kansiot läpi C++:lla?

Legu [13.09.2006 15:29:16]

#

1. Ruutu tyhjennetään:

SDL_FillRect(pinta, NULL, SDL_MapRGB(pinta->format, RED, GREEN, BLUE));

2. Pienellä googletuksella: MSDN:n aihe

Meitsi [13.09.2006 15:49:06]

#

Jos halutaan ruutu suoraan mustaksi niin

SDL_FillRect(pinta, NULL, 0);

riittää. Optimoidaan sieltä se yksi funktiokutsu pois ;)

temu92 [13.09.2006 15:54:40]

#

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/12765-cpp-linux-md5-hashi-tiedostosta
Miten saan direntksi määritellyn tiedostonimen(?) chariksi?

Legu [13.09.2006 17:04:50]

#

Googlesta löytyi, että olisi d_name

struct dirent *joku;
//... opendir() ... readdir() ...
joku->d_name

(ei ole kokemusta direntin käytöstä)

Hörpeli [13.09.2006 20:35:31]

#

/* 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);
    }
}

tgunner [14.09.2006 17:58:40]

#

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);
	}
}

Sisuaski [15.09.2006 07:23:44]

#

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.

tgunner [15.09.2006 07:58:10]

#

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).

Metabolix [15.09.2006 19:39:12]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta