2011-11-15 8 views
2

J'utilise SDL en mode fenêtré. Etant donné un grand sprite, disons 1024 x 640, est-il plus rapide de transformer l'image entière en plusieurs petits carreaux, par exemple 32 x 32 px, que de faire le fond de l'image en même temps?SDL: Optimisation du temps de fusion

Je dois fondre un arrière-plan sur l'écran (1024 * 640) en mode fenêtré à 30 FPS (au moins). Je pense que la double mise en mémoire tampon et la surface matérielle ne peuvent pas être utilisées en fenêtrage ... Pour l'instant, je blit l'ensemble du sprite à la fois, mais la consommation du processeur semble être très élevée pour un simple fond.

+1

Ne pas oubliez de [convertir vos surfaces au format d'affichage] (http://www.libsdl.org/docs/html/sdldisplayformat.html), sinon SDL effectuera des conversions en arrière-plan pour * chaque blit *. – genpfault

+0

Je l'ai fait. Mais, blit encore sont gourmands en CPU ... –

+0

@ArnaudG Je sais que c'est assez vieux, mais comment calculez-vous la consommation du processeur? Quel framerate obtenez-vous? – emartel

Répondre

0

Tout d'abord, assurez-vous que l'image est dans un petit format de type de fichier comme "PNG". En second lieu, lorsque vous bloquez l'image, assurez-vous de ne pas ajouter la couleur de transparence à l'image d'arrière-plan, car cela ne sert à rien et demande BEAUCOUP de cycles de cpu. Voici un exemple de code que j'ai écrit il y a longtemps comme un wrapper pour le chargement des images

SDL_Surface* altSDL::load_image(std::string filename) 
{ 
    SDL_Surface* loadedImage = NULL; 

    SDL_Surface* optimizedImage = NULL; 

    loadedImage = IMG_Load(filename.c_str()); 

    if(loadedImage != NULL) 
    { 
     optimizedImage = SDL_DisplayFormat(loadedImage);   
     SDL_FreeSurface(loadedImage); 
    } 
    else 
    { 
     Failure* fail; 
     fail = Failure::getInstance(); 
     fail->failLog(filename); 
    } 

    if(optimizedImage != NULL) 
    { 
     Uint32 colorkey = SDL_MapRGB(optimizedImage->format, 0xFF, 0, 0xFF); 
     SDL_SetColorKey(optimizedImage, SDL_SRCCOLORKEY, colorkey); 
    } 

    return optimizedImage; 
} 

Dans ce code, vous serez en mesure de passer toutes vos images dans ce à optimiser très en toute transparence, mais dans le cas de fond/grandes images que vous devez vous assurer que ce dernier bloc de code est remplacé par quelque chose de plus le long des lignes de quelque chose comme ceci:

//Added some Sudo code 

    if(loadedImage != NULL && !isBigImage) 
      { 
       optimizedImage = SDL_DisplayFormat(loadedImage);   
       SDL_FreeSurface(loadedImage); 
      } 
      else if(!isBigImage) 
      { 
       Failure* fail; 
       fail = Failure::getInstance(); 
       fail->failLog(filename); 
      } 

le isBigImage est le code sudo i ajouté et est un paramètre passé dans; dans certains cas.Cela rendra toutes vos images optimisées, plus petites (Devrait s'assurer qu'ils sont des fichiers PNG) et le rendra si la transparence est seulement ajouté aux petits fichiers image afin que votre fond ne résout pas votre fps