buffer de hardware usando SDL, pergunta sobre como ele funciona
-
03-07-2019 - |
Pergunta
Estou decidindo fazer o meu primeiro jogo, que vai ser simples, mas eu quero usar c ++ e eu escolhi SDL para o meu aprendizado. Então, minha pergunta é sobre como os "buffers" são tratadas quando escrever código. Vou postar meu código relacionado na parte inferior.
Ok, então basicamente a maneira que eu entendo é que SDL cuida dos quais tampão está realmente sendo atraídos para a tela. Quando estou escrevendo para um buffer é sempre a backbuffer Estou escrevendo para, ou o buffer actualmente a ser desenhado na tela. Então, quando eu chamo SDL_Flip (tela) ele "blits" minha superfície da tela para o backbuffer, então move o ponteiro para que buffer está sendo atraído para esse buffer, que costumava ser o backbuffer, o que eu estava trabalhando, eo tampão de idade que foi mostrando torna-se agora o backbuffer. Neste ponto, se eu chamo SDL_FillRect (argumentos) que será realizada no agora de volta tampão?
Eu vou postar todo o meu "coração" do meu jogo de aprendizagem, uma vez que pode ajudar a esclarecer a minha pergunta:
//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;
}
}
Solução
altamente depende do seu sistema (ie. X11, Linux frame buffer, Windows), e os usos backend SDL para interagir com ele. Também qual bandeiras você passs para SDL_SetVideoMode. Existem basicamente superfícies de software que sentar-se em uma região da memória em que você programa e superfícies de hardware que são colocados na memória do cartão gráfico. O que você descreve parece-me ser um buffer duplo, que é ativado se você passar SDL_HWSURFACE | SDL_DOUBLEBUF a SDL. Basta lembrar isto não é suportado em todas as plataformas e configurações e você pode obter algo diferente em seu lugar.