mise en mémoire tampon du matériel à l'aide de SDL, question sur son fonctionnement

StackOverflow https://stackoverflow.com/questions/814326

  •  03-07-2019
  •  | 
  •  

Question

Je décide de faire mon premier jeu, ça va être simple mais je veux utiliser le c ++ et j'ai choisi SDL pour mon apprentissage. Ma question porte donc sur la manière dont les "tampons" sont traités lors de l'écriture du code. Je posterai mon code associé en bas.

Ok, donc je crois comprendre que SDL gère le type de tampon actuellement affiché à l'écran. Lorsque j'écris dans un tampon, c'est toujours le backbuffer auquel j'écris ou le tampon actuellement non dessiné à l'écran. Ainsi, lorsque j'appelle SDL_Flip (écran), il "blit". ma surface d’écran sur la mémoire tampon, puis déplace le pointeur sur lequel le tampon est dessiné vers cette mémoire tampon qui était auparavant la mémoire tampon, celle sur laquelle je travaillais, et l’ancienne mémoire tampon qui était affichée devient à présent la mémoire tampon. A ce stade, si j'appelle SDL_FillRect (arguments), il sera exécuté sur le tampon maintenant en arrière?

Je vais publier l'ensemble de mes "battements de coeur". de mon jeu d’apprentissage, car cela peut aider à clarifier ma question:

//While the user hasn't quit
while( quit == false )
{
    //If there's an event to handle
    if( SDL_PollEvent( &event ) )
    {
        //If a key was pressed
        if( event.type == SDL_KEYDOWN )
        {
            //Set the proper message surface
            switch( event.key.keysym.sym )
            {
                case SDLK_UP: message = upMessage; break;
                case SDLK_DOWN: message = downMessage; break;
                case SDLK_LEFT: message = leftMessage; break;
                case SDLK_RIGHT: message = rightMessage; break;
            }
        }

        else if( event.type == SDL_QUIT ) //if the user clicks the little X in the upper right corner.
        {
            quit = true;
        }
    }

    //If a message needs to be displayed
 if( message != NULL )
 {
      // Clear the back buffer.
      SDL_FillRect( SDL_GetVideoSurface(), NULL, 0 );

      //Draw the backgroudn to the back buffer.
      apply_surface( 0, 0, background, screen );

      // Draw the "message" to the back buffer.
      apply_surface( ( SCREEN_WIDTH - message->w ) / 2, ( SCREEN_HEIGHT - message->h ) / 2, message, screen );

      //Null the surface pointer
      message = NULL;
    }

    //Swap the current and back buffer.
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;
    }
}
Était-ce utile?

La solution

Cela dépend fortement de votre système (X11, tampon de trame Linux, Windows) et du back-end utilisé par SDL pour interagir avec lui. Indique également quels indicateurs vous passez à SDL_SetVideoMode. Il existe essentiellement des surfaces logicielles situées dans une zone de mémoire de votre programme et des surfaces matérielles placées dans la mémoire de la carte graphique. Ce que vous décrivez me semble être un double tampon, activé si vous passez SDL_HWSURFACE | SDL_DOUBLEBUF à SDL. Rappelez-vous que cela n’est pas pris en charge sur toutes les plates-formes et configurations et que vous obtiendrez peut-être quelque chose de différent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top