Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SDL的硬件缓冲,关于它如何工作的问题 我决定做我的第一个游戏,它会很简单,但是我想用C++,我选择SDL来学习。因此,我的问题是关于在编写代码时如何处理“缓冲区”。我将在底部发布我的相关代码_C++_Sdl_Hardware Interface - Fatal编程技术网

使用SDL的硬件缓冲,关于它如何工作的问题 我决定做我的第一个游戏,它会很简单,但是我想用C++,我选择SDL来学习。因此,我的问题是关于在编写代码时如何处理“缓冲区”。我将在底部发布我的相关代码

使用SDL的硬件缓冲,关于它如何工作的问题 我决定做我的第一个游戏,它会很简单,但是我想用C++,我选择SDL来学习。因此,我的问题是关于在编写代码时如何处理“缓冲区”。我将在底部发布我的相关代码,c++,sdl,hardware-interface,C++,Sdl,Hardware Interface,好的,基本上我的理解是SDL负责将哪个缓冲区实际绘制到屏幕上。当我写入缓冲区时,它总是我正在写入的backbuffer,或者当前未在屏幕上绘制的缓冲区。因此,当我调用SDL_Flip(screen)时,它会将我的屏幕表面“blit”到backbuffer上,然后将要绘制的缓冲区的指针移动到以前是backbuffer的缓冲区,我一直在处理的缓冲区,现在显示的旧缓冲区变为backbuffer。此时,如果我调用SDL_FillRect(参数),它将在现在返回的缓冲区上执行 我将发布我学习游戏的整个“心

好的,基本上我的理解是SDL负责将哪个缓冲区实际绘制到屏幕上。当我写入缓冲区时,它总是我正在写入的backbuffer,或者当前未在屏幕上绘制的缓冲区。因此,当我调用SDL_Flip(screen)时,它会将我的屏幕表面“blit”到backbuffer上,然后将要绘制的缓冲区的指针移动到以前是backbuffer的缓冲区,我一直在处理的缓冲区,现在显示的旧缓冲区变为backbuffer。此时,如果我调用SDL_FillRect(参数),它将在现在返回的缓冲区上执行

我将发布我学习游戏的整个“心跳”,因为它可能有助于澄清我的问题:

//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|U表面| SDL|U DOUBLEBUF传递给SDL,则会启用该缓冲区。请记住,并非所有平台和配置都支持此功能,您可能会得到一些不同的功能。

您的陈述似乎基本正确,那么您的问题是什么?