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 :

Création d'un écran virtuel sous SDL


Sujet :

SDL

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 16
    Points
    16
    Par défaut Création d'un écran virtuel sous SDL
    Voila je voudrez crée un écran virtuel sous SDL affin de gagner un tot de rafraichissement convenable. Aise le même principe que sous le mode VESA.
    -allocation mémoire
    -calcule de l'image
    -copie de l'écran virtuel sur l'adresse vidéo.
    Voila si vous pourriez me dépanné d'un code car en se moment je but.

    @++

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    bonjour,
    Je ne vois pas ce que tu veux faire.

    Pour passer une surface sur l'écran, il faut juste faire SDL_Flip(SDL_Surface *surface).
    Pour ça, il faut avoir initialisé la surface avec SDL_InitVideo().

    De plus, dans le header SDL_video.h on peut voir ces drapeaux:

    • SDL_HWSURFACE
    • SDL_SWSURFACE
    • SDL_HWACCEL
    • SDL_RLEACCEL
    • SDL_DOUBLEBUF --> pour utiliser SDL_Flip()


    et peut-être encore d'autres. Ils te permettent d'accélérer.

    Si ca ne résout pas ton problème, peut tu nous dire ce que tu entends par écran virtuel? Je comprend ça comme une surface qu'on travaille et qu'on balance en tant qu'écran.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    Tout simplement lorsque tu écrit dans la surface écran tu écrit dans la mémoire de la carte graphique. Aure les info vont du cpu a la mémoire de la carte. Maintenant si tu écrit dans la mémoir central l'acset est plus rapide. Il te sufie de copie les donnée en mémoire central sur la mémoire de la carte graphique. Sachant que SDL a des convention qui luis est propre, j'aimerai connaitre comment présenter le programme.
    Il faut crées une surface alfa se trouvant sur la mémoire central, puis une surface béta se trouvant sur la carte. Tout le long du programme l'on écrit sur la surface alfa puis on copie alfa sur béta d'un seul coup.

    Voila @++

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    ok

    donc voila comment créer une surface sur la mémoire vidéo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SDL_Surface *screen;
    screen = SDL_SetVideoMode(largeur, hauteur, bpp (généralement 32, byte per pixel), SDL_HWSURFACE | other flags);
    Si tu veux à chaque affichage copier une surface sur celle de la mémoire vidéo, il vaut mieux utiliser SDL_Flip() et SDL_DOUBLEBUF.

    voila donc un code:
    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
    #include <SDL/SDL.h>
    #include <stdio.h>
     
    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;
      }
     
      /* surface qui sert à l'affichage dans la mémoire vidéo */
      SDL_Surface *ecran;
      ecran = SDL_SetVideoMode(600, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
     
      if (ecran == NULL)
      {
        printf("Error: %s\n", SDL_GetError();
        return 1;
      }
     
      //On crée une surface dans la mémoire système
      SDL_Surface *Virtuel;
      Virtuel = SDL_CreateRGBSurface(SDL_SWSURFACE, ecran->w, ecran->h, 32, 0, 0, 0, 0);
      if (Virtuel == NULL)
      {
        printf("Error: %s\n", SDL_GetError();
        return 1;
      }
     
      /* maintenant on peut travailler Virtuel comme on veut
          et à l'affichage il faut utiliser:
          SDL_BlitSurface(Virtuel, NULL, ecran, NULL);
          SDL_Flip(ecran);
      */
      ...
    }
    A noter qu'avec SDL il est plus intéressant d'utiliser la mémoire centrale seulement lorsque l'on fait beaucoup de manipulations pixel par pixel, si on se contente de copier des surfaces les unes sur les autres il vaut mieux utiliser la mémoire vidéo. (pour toutes les surfaces concernées)

    http://www.libsdl.org/cgi/docwiki.cg...5fSetVideoMode pour plus d'infos.

    @++

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    merci a toi sa a l'aire super seulement i y a un problème
    Virtuel = SDL_CreateSurface(SDL_SWSURFACE, ecran->w, ecran->h, 32, 0, 0, 0, 0);
    n'arrive pas à être compiler
    Il me met :23 C:\Dev-Cpp\travail\ese sdl\SansNom1.cpp `SDL_CreateSurface' undeclared (first use this function)

    Voila merci a toi sinon @++

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    En fais le truc j'ai exactement les meme resultat qu'aven

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <SDL/SDL.h>
    #include <stdio.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;
     
     
     
    void dot(int x, int y, char rouge, char gaune, char bleu)
    {
      *((Uint16*)(Virtuel->pixels) + x + y * Virtuel->w) = SDL_MapRGB(Virtuel->format, rouge, gaune, bleu);
    }
     
    void attendreTouche(void)
    {
      SDL_Event event;
     
      do
        SDL_WaitEvent(&event);
      while (event.type != SDL_QUIT && event.type != SDL_KEYDOWN);
    }
     
    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_FULLSCREEN );
      Virtuel = SDL_CreateRGBSurface(SDL_SWSURFACE, ecran->w, ecran->h, 16, 0, 0, 0, 0);
     
      if (ecran == NULL)
      {
        printf("Error: %s\n", SDL_GetError());
        return 1;
      }
     
     
      if (Virtuel == NULL)
      {
        printf("Error: %s\n", SDL_GetError());
        return 1;
      }
     
        int i;
        int j;
        int k;
        int co1;
        int co2;
        int co3;
        for (j = 0; j < 80; j++)
        {
            co1 = rand() % 255;
            co2 = rand() % 255;
            co3 = rand() % 255;
            for (i = 0; i < 1024; i++)
            { 
              for (k = 0; k < 768; k++) dot(i, k, co1, co2 ,co3);
              {
                dot(i,j,co1,co2,co3);
              }
            }
            SDL_BlitSurface(Virtuel, NULL, ecran, NULL);
            SDL_Flip(ecran);
        }
     
        attendreTouche();
     
    }
    Je vous présente mon code tu peux me dire se qu'il ne va pas.

    voila @++

  7. #7
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    Ton code ne fait pas de double mais du triple buffering !!!
    Tu epeux simplement appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran = SDL_SetVideoMode(1024, 768, 16, SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN );
    Et ne pas utiliser de surface virtuelle. Cela demandera à SDL de stocker la surface en mémoire centrale.

    Par ailleurs, il y a une petite faute (pas bien grave cependant) : la condition
    devrait se vérifier juste après l'initialisation de cette variable. Sinon il y a le risque que ecran->w et ecran->h ne renvoient pas les bonnes valeurs.

    Bon coding !
    @+

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 40
    Points : 16
    Points
    16
    Par défaut
    J'ai fais l'essai mais sa reviens a mon code précédant.
    Par quelle moyen peut'on atteindre un FPS maximale sous SDL.h?

  9. #9
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    Avec une résolution de 320x240 !!!

  10. #10
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    oui sinon le pb avec mon code c'était que c'est pas SDL_CreateSurface mais SDL_CreateRGBSurface...

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/09/2014, 14h12
  2. Création de ports ttyS virtuel sous linux
    Par L1M8E9 dans le forum Matériel
    Réponses: 0
    Dernier message: 13/05/2009, 10h05
  3. Création de XMLHttpRequest à chaque requête sous IE
    Par mathieu dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 17/11/2005, 12h11
  4. Création de plusieurs niveaux de sous formulaires
    Par Farbin dans le forum Access
    Réponses: 2
    Dernier message: 25/10/2005, 20h15
  5. Création d'une imprimante virtuelle
    Par pilpagouna dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/06/2004, 13h38

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