CPU 与 GUI 有关的循环放宽和延迟
CPU relaxation and delays in loops concerning GUIs
如果你设计一个简单的图形用户界面应用程序,你可以do something like this:
while( running ){
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 ){
//User requests quit
if( e.type == SDL_QUIT ){
running = false;
}
//Handle button events
for( int i = 0; i < TOTAL_BUTTONS; ++i ){
gButtons[ i ].handleEvent( &e );
}
}
//Clear screen
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer );
//Render buttons
for( int i = 0; i < TOTAL_BUTTONS; ++i ){
gButtons[ i ].render();
}
//Update screen
SDL_RenderPresent( gRenderer );
}
现在,如果您就这样离开,由于无限循环,您的核心之一应该在大部分执行时间都处于 ~100% 的状态。 (没有任何delay-function)
如何在保持单线程应用程序的 GUI 响应的同时放松 CPU?
也许说的很明显,但是只要您在 CPU 密集事件轮询循环中注入一个小延迟,CPU 负载就会直线下降到几乎 0%
while( SDL_PollEvent( &e ) != 0 ){
//User requests quit
if( e.type == SDL_QUIT ){
running = false;
}
//Handle button events
for( int i = 0; i < TOTAL_BUTTONS; ++i ){
gButtons[ i ].handleEvent( &e );
}
SDL_Delay(10); // wait 10ms
}
您可以调整延迟,但几乎不会引起注意(除非您使用 500 作为值)。
这允许避免线程和计时器(可能使用线程、信号,嗯,不是单线程环境)。在异国情调的平台(例如:Nintendo DS)上非常基本地实现 SDL 非常好
如果你设计一个简单的图形用户界面应用程序,你可以do something like this:
while( running ){
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 ){
//User requests quit
if( e.type == SDL_QUIT ){
running = false;
}
//Handle button events
for( int i = 0; i < TOTAL_BUTTONS; ++i ){
gButtons[ i ].handleEvent( &e );
}
}
//Clear screen
SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear( gRenderer );
//Render buttons
for( int i = 0; i < TOTAL_BUTTONS; ++i ){
gButtons[ i ].render();
}
//Update screen
SDL_RenderPresent( gRenderer );
}
现在,如果您就这样离开,由于无限循环,您的核心之一应该在大部分执行时间都处于 ~100% 的状态。 (没有任何delay-function)
如何在保持单线程应用程序的 GUI 响应的同时放松 CPU?
也许说的很明显,但是只要您在 CPU 密集事件轮询循环中注入一个小延迟,CPU 负载就会直线下降到几乎 0%
while( SDL_PollEvent( &e ) != 0 ){
//User requests quit
if( e.type == SDL_QUIT ){
running = false;
}
//Handle button events
for( int i = 0; i < TOTAL_BUTTONS; ++i ){
gButtons[ i ].handleEvent( &e );
}
SDL_Delay(10); // wait 10ms
}
您可以调整延迟,但几乎不会引起注意(除非您使用 500 作为值)。
这允许避免线程和计时器(可能使用线程、信号,嗯,不是单线程环境)。在异国情调的平台(例如:Nintendo DS)上非常基本地实现 SDL 非常好