аппаратная буферизация с использованием SDL, вопрос о том, как она работает

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Я решил сделать свою первую игру, она будет простой, но я хочу использовать c ++, и я выбрал SDL для своего обучения. Поэтому мой вопрос о том, как "буферы" обрабатываются при написании кода. Я опубликую свой соответствующий код внизу.

Хорошо, в общем, насколько я понимаю, SDL заботится о том, какой буфер на самом деле выводится на экран. Когда я пишу в буфер, это всегда буфер, в который я пишу, или буфер, который в данный момент не отображается на экране. Поэтому, когда я вызываю SDL_Flip (экран), он «блицает» Мой экран накрывает буфер, затем перемещает указатель на буфер, который рисуется на тот буфер, который раньше был буфером, над которым я работал, и старый буфер, который показывал, теперь становится буфером. В этот момент, если я вызову SDL_FillRect (arguments), это будет выполнено для буфера теперь назад?

Я собираюсь опубликовать все мое "сердцебиение" моей обучающей игры, которая может помочь прояснить мой вопрос:

//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;
    }
}
Это было полезно?

Решение

это сильно зависит от вашей системы (т. е. X11, фрейм-буфера Linux, Windows), и бэкэнд-SDL использует для взаимодействия с ней. Также, какие флаги вы передаете в SDL_SetVideoMode. Есть в основном программные поверхности, которые находятся в области памяти в вашей программной и аппаратной поверхностях, которые размещены в памяти графической карты. То, что вы описываете, мне кажется двойным буфером, который включается, если вы передаете SDL_HWSURFACE | SDL_DOUBLEBUF для SDL. Просто помните, что это поддерживается не на всех платформах и конфигурациях, и вы можете получить что-то другое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top