IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

pixels ou SDL_surface 8 bits?


Sujet :

SDL

  1. #1
    Membre habitué

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Points : 127
    Points
    127
    Par défaut pixels ou SDL_surface 8 bits?
    Bonjour,

    j'ai posté récemment un petit projet c++ pour afficher le mandelbrot.
    Mon problème, c'est que je calcul l'image à 60 FPS, alors qu'elle s'affiche à 15FPS seulement.

    Je pense que c'est parce que pour chaque pixel, je blitte une surface rgb 32 bits de taille 1x1.

    J'ai cru comprendre qu'on pouvait colorer les pixels à la main, ou utiliser du rgb 8 bits pour aller plus vite.

    Dans les deux cas (et plus particulièrement le deuxième), je ne sais pas comment faire.

    Pourriez vous m'aider svp?

    Pour l'instant ça se passe comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // allocation des surfaces
    SDL_Surface** surfaces = (SDL_Surface**) malloc(size*sizeof(SDL_Surface*)) ;
    for (int i = 0 ; i < size ; ++i) {
        surfaces[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, 1, 32, 0, 0, 0, 0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // blit de la surface mid [qui est un indice de boucle parcourant tout l'écran]
    // zou est une structure contenant mes couleurs rgb
    SDL_FillRect(surfaces[mid], NULL, SDL_MapRGB(ecran->format, zou.red, zou.green, zou.blue));
    SDL_BlitSurface(surfaces[mid], NULL, ecran, &Position) ;

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 166
    Points : 332
    Points
    332
    Par défaut
    houlà un blit hardware par pixel.. argh ... là ta carte vidéo affiche une texture différente à chaque pixel tu m'étonnes que ça rame

    je connais très mal SDL...

    avec la librairie windows on fait comme ça pour afficher une soupe de pixels: on modifie les cellules d'un tableau de pixels et on le balance dans une seule image blittée (enfin, deux images, pour avoir le doublebuffer)

    donc si on applique ça à SDL, tu peux modifier une texture pixel par pixel, et la blitter dans un seul rectangle

    si ta texture est un rgb 8 bits alors oui ça devrait être plus rapide, au lieu de mettre à jour 24 bits par pixels, tu n'en mets à jour que 8.. ensuite la carte vidéo se charge d'appliquer la palette.. mais là je m'y connais mal aussi

    mais il me semble que dans SDL il existe un truc tout fait pour gérer l'affichage pixel par pixel, mais je me souviens plus donc je suis pas sûr
    pour voir à quoi ressemble un projet amateur qui a réussi: http://www.advsys.net/ken/build.htm

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Nous avons de la chance, la documentation décrit une méthode pour changer les pixels d'une surface: http://www.libsdl.org/docs/html/guidevideo.html#AEN97
    (Cherchez un peu autour dans la doc ne fera pas de mal)

    Le blit pixel par pixel est la pire chose, car j'imagine que le lock sur les surfaces va être enclenché plusieurs fois au lieu d'une et une seule fois.

    Sinon, la technique de flasheur en passant par un buffer (donc surface en mémoire, temporaire, puis blit) est une bonne idée ...

    Et je suis désolé de dire, mais la SDL avec les PCs, n'a aucune opération accélérée par la hardware ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 166
    Points : 332
    Points
    332
    Par défaut
    ??? attends tu veux dire que dans SDL, tout ce que gère la carte vidéo sur PC c'est la vsync ?

    j'ai toujours lu que dans SDL le blit est accéléré par le gpu
    pour voir à quoi ressemble un projet amateur qui a réussi: http://www.advsys.net/ken/build.htm

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par flasheur Voir le message
    ??? attends tu veux dire que dans SDL, tout ce que gère la carte vidéo sur PC c'est la vsync ?

    j'ai toujours lu que dans SDL le blit est accéléré par le gpu
    C'est quoi que vous appelez le vsync ? Copie du buffer software sur l'ecran ? ... alors oui ... c'est surement le minimum.

    En fait, la SDL peut etre accelere par le GPU, mais le seul cas ou je suis sur que cela est fait ... c'est sur la GP2X ...

    Essayez d'avoir une grande surface (1024x786) et de remplire tile par tile de 32x32 ... vous allez voir ... les performances ne sont pas vraiment convaincantes.

    Vous allez peut etre me parler des flags SDL du genre SDL_HWSURFACE. Oui on doit utiliser ces flags mais non ... il ne sont pas toujours efficace. Il y a moyen de savoir si la plateforme accelere par le GPU les interactions de la SDL avec une fonction dont j'ai legerement oublier le nom -> ah ! http://code.google.com/p/openawars/s..._Window.cpp#57 SDL_GetVideoInfo()
    Et sur windows on voit bien qu'il n'y a pas de hardware ....
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre habitué

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Points : 127
    Points
    127
    Par défaut
    En effet, j'ai codé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    void putPixel(SDL_Surface * surface, Uint16 x, Uint16 y, colors c)
    {    
    	Uint32 color = getcolor(c) ;
    	Uint8 bpp = surface->format->BytesPerPixel;  
    	Uint8 * p = ((Uint8 *)surface->pixels) + y * surface->pitch + x * bpp;     
    	switch(bpp)    
    	{	  
    	case 1:		
    		*p = (Uint8) color;		
    		break;        
    	case 2:            
    		*(Uint16 *)p = (Uint16) color;            
    		break;        
    	case 3:            
    		if (SDL_BYTEORDER == SDL_BIG_ENDIAN)            
    		{                
    			*(Uint16 *)p = ((color >> 8) & 0xff00) | ((color >> 8) & 0xff);                
    			*(p + 2) = color & 0xff;            
    		}            
    		else           
    		{                
    			*(Uint16 *)p = color & 0xffff;                
    			*(p + 2) = ((color >> 16) & 0xff) ;            
    		}            
    		break;        
    	case 4:            
    		*(Uint32 *)p = color;            
    		break;    
    	}
    }
    ce qui me permet de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    putPixel(ecran, i, j, zou) ;
    ce qui m'amene à 195 FPS : nettement mieux

    merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bits par pixel & mémoire
    Par ggwtf dans le forum C
    Réponses: 15
    Dernier message: 01/10/2010, 15h12
  2. Réponses: 7
    Dernier message: 10/06/2009, 22h29
  3. nombres de bit par pixel
    Par hassiba_45 dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/04/2008, 12h51
  4. nombre de bits par pixel
    Par madjidri dans le forum C++Builder
    Réponses: 1
    Dernier message: 24/05/2007, 16h01
  5. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo