аппаратная буферизация с использованием SDL, вопрос о том, как она работает
-
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. Просто помните, что это поддерживается не на всех платформах и конфигурациях, и вы можете получить что-то другое.