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 :

SDL2 afficher du texte plus vite


Sujet :

SDL

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut SDL2 afficher du texte plus vite
    Bonjour,
    je debute en programmation, j ai ecrit une routine pour afficher du texte un peu plus vite,
    et qui fonctionne a peu pres bien.
    le probleme est que quand j essai d utiliser memcpy au lieu de SDL_UpdateTexture,
    le texte est deforme car la surface du texte(surface_texte) n a pas la meme taille(hauteur et largeur) que la texture qui sert de cache(texture_texte).
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include<SDL.h>
    #include<SDL_image.h>
    #include<string.h>
    #include<SDL_ttf.h>
     
    SDL_Window *fenetre;
    SDL_Renderer *render;
    TTF_Font *police;
    SDL_Texture *texture_texte ;
     
    void new_texture(SDL_Texture *texture,SDL_Surface *surface) //texture2 SDL_TEXTUREACCESS_STREAMING
    {  SDL_Rect taille={0,0,surface->w,surface->h};
       SDL_Surface *surface2;
      void *mpixels ; int mpitch;
      if(surface->format!=SDL_GetWindowSurface(fenetre)->format)
       surface2=SDL_ConvertSurface(surface,SDL_GetWindowSurface(fenetre)->format,NULL);
      else surface2=surface;
     
      //SDL_LockTexture(texture,&taille,&mpixels,&mpitch);
     // memcpy(mpixels,surface2->pixels,surface2->pitch*surface2->h);
     // SDL_UnlockTexture(texture);
      SDL_UpdateTexture(texture,&taille,surface2->pixels,surface2->pitch);
     
      SDL_FreeSurface(surface2);
    }
     
    void print(char *texte,int c, int l, Uint8 r,Uint8 v, Uint8 b)
    { SDL_Color color={r,v,b};
      SDL_Surface *surface_texte=TTF_RenderText_Solid(police,texte,color);
     
      new_texture(texture_texte,surface_texte);
     
      SDL_Rect rec_texte={0,0,surface_texte->w,surface_texte->h};
      SDL_Rect position={c,l,surface_texte->w,surface_texte->h};
      SDL_RenderCopy(render,texture_texte,&rec_texte,&position);
     
      SDL_FreeSurface(surface_texte);
    }
     
     
    int main(int a,char **b)
    { SDL_Init(SDL_INIT_EVERYTHING);
      fenetre=SDL_CreateWindow("SDL2",100,100,800,600,0);
      render=SDL_CreateRenderer(fenetre,-1,SDL_RENDERER_ACCELERATED);
      TTF_Init();
      police=TTF_OpenFont("ARMY RUST.ttf",22);
      texture_texte=SDL_CreateTexture(render,SDL_GetWindowPixelFormat(fenetre),SDL_TEXTUREACCESS_STREAMING,400,40);
     
      print("essai de texte",400,0,255,255,0);
      SDL_RenderPresent(render);
     
      SDL_Delay(5000);
     
      SDL_DestroyTexture(texture_texte);
      SDL_DestroyWindow(fenetre);
      SDL_DestroyRenderer(render);
      SDL_Quit();
      return 1;
    }
    voici le code, je rame un peu...

    merci d avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    As-tu regardé ce que faisait la fonction SDL_UpdateTexture? Peut être qu'il y a une réponse plus évidente au niveau de leur code.

    Sinon, n'aurais tu pas oublié d'ajouter la largeur au niveau de ta copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SDL_LockTexture(texture,&taille,&mpixels,&mpitch);
    memcpy(mpixels,surface2->pixels,surface2->pitch*surface2->h*surface2->w);
    SDL_UnlockTexture(texture);

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    ben, le pitch je crois que c est la longueur en octet d une ligne complete
    https://wiki.libsdl.org/SDL_Surface

    SDL_UpdateTexture fonctionne tres bien, sous cette forme le code est foonctionnel,
    c est quand j essaie d utiliser a la place de cette fonction memcpy (et donc j enleve SDL_UpdateTexture)
    que ça bug, il n apparait qu une forme de gribouiller rapplati dans le sens horizontal...

  4. #4
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    c est bon j ai trouvé,
    dans memcpy il faut copier ligne par ligne evidemment !
    400*4 est dans cet exemple la longueur en octet d une ligne du cache de la texture


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SDL_LockTexture(texture,NULL,&mpixels,&mpitch);
      for(int ligne=0;ligne<surface2->h;ligne++)
       memcpy(mpixels+ligne*400*4,surface2->pixels+ligne*surface2->pitch,surface2->pitch);
      SDL_UnlockTexture(texture);
    ça tourne !

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 902
    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 902
    Points : 220 064
    Points
    220 064
    Billets dans le blog
    126
    Par défaut
    Bonjour,

    Pourquoi souhaitez vous afficher du texte plus vite ? Avez-vous remarqué un souci ?
    D'autant plus qu'en réalité, il suffit juste de sauvegardé la surface/texture du texte et non la créer à chaque print() (sauf si le texte est dynamique).

  6. #6
    Membre du Club

    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 69
    Points
    69
    Par défaut
    c est pour afficher du texte en dynamique, la SDL2 avec SDL_ttf a la reputation d avoir un probleme de lenteur a cet effet,
    j avais penser que utiliser SDL_UpdateTexture ou bien memcpy pourrais un peu arranger les choses,
    la solution la plus courante est de mettre en cache en texture tout l alphabet je crois,


    je me demandais d ou viens cette lenteur, je veux dire quelle est l instruction qui provoque ce lag ?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 902
    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 902
    Points : 220 064
    Points
    220 064
    Billets dans le blog
    126
    Par défaut
    Le lag provient (si tel a été le développement) du fait que la surface générée est envoyée en mémoire vidéo (mémoire GPU), faisant ainsi qu'à chaque mise à jour le transfert (couteux) CPU -> GPU est effectué.
    La solution : ne pas faire de SDL_Texture du texte à afficher.
    La seconde solution : écrire du texte avec une font bitmap (une image comportant toutes les lettres).

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

Discussions similaires

  1. Comment afficher du texte avec swing ?
    Par meda dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/10/2004, 14h35
  2. [TabControl] Afficher du texte en transparence
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/10/2004, 23h01
  3. Afficher du texte en couleur sous Borland C++ 4.02
    Par Cthulhu 22 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/11/2003, 00h53
  4. afficher du texte
    Par Mau dans le forum OpenGL
    Réponses: 10
    Dernier message: 24/06/2003, 15h31
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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