SDL2 主游戏循环

SDL2 main game loop

我的问题是在 lazyfoo.net 阅读 SDL2 教程时突然出现的,代码是从 this page

复制的
int main( int argc, char* args[] )
{

//Start up SDL and create window

if( !init() )
{
    printf( "Failed to initialize!\n" );
}
else
{
    //Load media
    if( !loadMedia() )
    {
        printf( "Failed to load media!\n" );
    }
    else
    {
        //Main loop flag
        bool quit = false;

        //Event handler
        SDL_Event e;

        //While application is running
        while( !quit )
        {
            //Handle events on queue
            while( SDL_PollEvent( &e ) != 0 )
            {
                //User requests quit
                if( e.type == SDL_QUIT )
                {
                    quit = true;
                }
            }

            //Clear screen
            SDL_RenderClear( gRenderer );

            //Render texture to screen
            SDL_RenderCopy( gRenderer, gTexture, NULL, NULL );

            //Update screen
            SDL_RenderPresent( gRenderer );
        }
    }
}

//Free resources and close SDL
close();

return 0;
}

这就是为什么我们要在主循环中渲染效果并一次又一次地使它 运行 而不是像这样:

int main( int argc, char* args[] )
{
//Start up SDL and create window
if( !init() )
{
    printf( "Failed to initialize!\n" );
}
else
{
    //Load media
    if( !loadMedia() )
    {
        printf( "Failed to load media!\n" );
    }
    else
    {
        //Main loop flag
        bool quit = false;

        //Event handler
        SDL_Event e;

       //Clear screen
       SDL_RenderClear( gRenderer );

        //Render texture to screen
        SDL_RenderCopy( gRenderer, gTexture, NULL, NULL );

        //Update screen
        SDL_RenderPresent( gRenderer );

        //While application is running
        while( !quit )
        {
            //Handle events on queue
            while( SDL_PollEvent( &e ) != 0 )
            {
                //User requests quit
                if( e.type == SDL_QUIT )
                {
                    quit = true;
                }
            }
        }
    }
}

//Free resources and close SDL
close();

return 0;
}

我想这是有原因的,因为很多教程都这样做了。 但是我找不到原因。

Lazyfoo 的教程很不错,我会坚持下去。

出于某种原因,关于更新时间和帧速率的课程是 24 和 25,我想说有点晚了,但它们在那里。

就像我在评论中所说的那样,它是 Event Driven Programming。主循环应该读取事件,例如按键和鼠标点击,使用自上次更新以来经过的时间更新您的应用程序,然后呈现它。这种情况每秒会发生X次,也就是帧率。

该代码的编写方式可以稍后进行检查,但稍后会提供相关课程。

这是一个非常简单的主循环示例。

while ( appIsRunning ) {
    handleEvents();

    update( deltaTime );

    render();

    // If frames were 30, wait 33 ms before running the loop again
    delay( 1000/frames ); 
}

您一次又一次地渲染屏幕,因为屏幕上呈现的内容通常会发生变化。要表示这些更改,您需要更新显示。例如,如果一个球在屏幕上移动,而您只渲染一次屏幕,则球看起来不会移动。但是,如果您继续"run again and again",您将能够看到球在屏幕上移动。