SDL을 사용한 하드웨어 버퍼링, 작동 방식에 대한 질문
-
03-07-2019 - |
문제
나는 첫 번째 게임을하기로 결심하고 있습니다. 간단 할 것입니다. 그러나 C ++를 사용하고 싶고 학습을 위해 SDL을 선택했습니다. 따라서 제 질문은 코드를 작성할 때 "버퍼"가 처리되는 방법에 관한 것입니다. 내 관련 코드를 맨 아래에 게시하겠습니다.
좋아, 기본적으로 내가 이해하는 방식은 SDL이 실제로 화면에 어떤 버퍼를 그려야하는지 관리한다는 것입니다. 버퍼에 글을 쓸 때는 항상 내가 쓰고있는 백 버퍼 또는 현재 화면에 그려지지 않는 버퍼입니다. 따라서 SDL_FLIP (스크린)을 호출 할 때 화면 표면을 백 버퍼에 "블리트"하고, 포인터를 포인터로 이동하여 백부퍼, 내가 작업했던 것, 그리고 작업했던 버퍼로 그려진 버퍼에 그려집니다. 이제 보여준 오래된 버퍼는 백 버퍼가됩니다. 이 시점에서 SDL_FILLRECT (Arguments) 호출하면 Now Back Buffer에서 수행됩니까?
내 질문을 명확히하는 데 도움이 될 수 있으므로 학습 게임의 "하트 비트"전체를 게시 할 것입니다.
//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 to sdl. 이것이 모든 플랫폼과 구성에서 지원되는 것은 아니며 대신 다른 것을 얻을 수 있습니다.