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",您将能够看到球在屏幕上移动。
我的问题是在 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",您将能够看到球在屏幕上移动。