Probleme en prog SDL.h

sieuzac Messages postés 3 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 30 mai 2007 - 30 mai 2007 à 19:54
sieuzac Messages postés 3 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 30 mai 2007 - 30 mai 2007 à 21:14
Salut a tous.
Je voudrez savoir pourquoi mon va plus vite au TEMP 2 qu'au TEMP 1

#include <SDL/SDL.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

/* surface qui sert à l'affichage dans la mémoire vidéo */
SDL_Surface *ecran = NULL;

//On crée une surface dans la mémoire système
SDL_Surface *Virtuel = NULL;

Uint16 color[1024*768];

int main(int argc, char **argv)
{
/* SDL_INIT_VIDEO si besoin de seulement la vidéo */
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
printf("Error: %s\n", SDL_GetError());
return 1;
}
ecran = SDL_SetVideoMode(1024, 768, 16, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_HWACCEL | SDL_FULLSCREEN);

if (ecran == NULL)
{
printf("Error: %s\n", SDL_GetError());
return 1;
}

int i;
int j;
int k;
int l;
int co1;
int co2;
int co3;

//TEMP 1

for (k = 0; k < 80; k++)
{
    co1 = rand() % 255;
    co2 = rand() % 255;
    co3 = rand() % 255;

    Uint16 rgb = SDL_MapRGB(ecran->format, co1, co2, co3);  
    for (i=0; i<1024 ; i++)
    {
        for (j=0; j<768 ; j++)
        {
            l = j*1024 + i;
            color[l] = rgb;
        }
    }

          
    memcpy((Uint16*)(ecran->pixels),color,1024*768*2);  
    SDL_Flip(ecran);
}

//TEMP 2

for (k = 0; k < 80; k++)
{
    co1 = rand() % 255;
    co2 = rand() % 255;
    co3 = rand() % 255;

    Uint16 rgb = SDL_MapRGB(ecran->format, co1, co2, co3);  
    for (i=0; i<1024*768 ; i++) color[i] = rgb;
 

          
    memcpy((Uint16*)(ecran->pixels),color,1024*768*2);  
    SDL_Flip(ecran);
}

}

@++

2 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
30 mai 2007 à 20:40
Ton programme devrait meme pas marcher. Je sais pas si t'as conscience du fait que tu alloues une qté de mémoire monstrueuse dans ta pile:

Uint16 color[1024*768];  ce qui représente plus d'1Mo. Donc ton programme devrait crasher directement.

Dans le cas 2, tu fais moisn de calcul, donc ca va plus vite. Logique implacable en info.
Mais je comprends pas pk tu passes par un tableau intermédiaire. Cette version irait encore plus vite:

for (k = 0; k < 80; k++)
{
    co1 = rand() % 255;
    co2 = rand() % 255;
    co3 = rand() % 255;

    Uint16 rgb = SDL_MapRGB(ecran->format, co1, co2, co3);  
    Uint16 * ptr = (Uint16*)(ecran->pixels);

    for (i=0; i<1024*768 ; i++)
        ptr[i] = rgb;
 
    SDL_Flip(ecran);
}
0
sieuzac Messages postés 3 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 30 mai 2007
30 mai 2007 à 21:14
Tout simplament par cs que je fais comme si je calcule une image pixel par pixel.for(x 0; x < RX; x++) for (y 0; y< RY, y++) ptr[RX*y+x] = couleur_corespondant[RX*y+x];
mon objectif est de pouvoir fair une comande:
void dot( int x, int y, unsigned int color);

dout

//TEMP 1

for (k = 0; k < 80; k++)
{
    co1 = rand() % 255;
    co2 = rand() % 255;
    co3 = rand() % 255;

    Uint16 rgb = SDL_MapRGB(ecran->format, co1, co2, co3);  
    for (i=0; i<1024 ; i++)
    {
        for (j=0; j<768 ; j++)
        {
            l = j*1024 + i;
            color[l] = rgb;
        }
    }

          
    memcpy((Uint16*)(ecran->pixels),color,1024*768*2);  
    SDL_Flip(ecran);
}

@++
0
Rejoignez-nous