Domanda

Sto decidendo di fare il mio primo gioco, sarà semplice ma voglio usare c ++ e ho scelto SDL per il mio apprendimento. Quindi la mia domanda è su come i "buffer" " vengono gestiti durante la scrittura del codice. Pubblicherò il mio codice correlato in fondo.

Ok, quindi sostanzialmente capisco che SDL si occupa di quale buffer viene effettivamente disegnato sullo schermo. Quando scrivo su un buffer è sempre il backbuffer su cui sto scrivendo, o il buffer non è attualmente disegnato sullo schermo. Quindi, quando chiamo SDL_Flip (schermo), "blits " la mia superficie dello schermo sul backbuffer, quindi sposta il puntatore su quale buffer viene disegnato su quel buffer che era il backbuffer, quello su cui stavo lavorando, e il vecchio buffer che stava mostrando ora diventa il backbuffer. A questo punto, se chiamo SDL_FillRect (argomenti), verrà eseguito sul buffer ora indietro?

Pubblicherò tutto il mio "battito cardiaco" del mio gioco di apprendimento in quanto può aiutare a chiarire la mia domanda:

//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;
    }
}
È stato utile?

Soluzione

dipende fortemente dal tuo sistema (es. X11, frame buffer di Linux, Windows) e il backend che SDL usa per interagire con esso. Inoltre, quali flag si passano a SDL_SetVideoMode. Fondamentalmente ci sono superfici software che si trovano in una regione di memoria nel tuo programma e superfici hardware che sono collocate nella memoria della scheda grafica. Quello che descrivi mi sembra un doppio buffer, che è abilitato se passi SDL_HWSURFACE | Da SDL_DOUBLEBUF a SDL. Ricorda solo che questo non è supportato su tutte le piattaforme e configurazioni e potresti invece ottenere qualcosa di diverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top