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 非常好