在后台暂停[C,SDL2]

时间:2015-10-25 19:41:48

标签: c cpu rendering

我正在关注lazyfoo's tutorial on SDL并在第03课中修改了许多方法中的代码,但主要关注点是while(SDL_PollEvent(&e)!=0)if(SDL_WaitEvent(&e))。最初,我决定使用SDL_Delay()来限制CPU,但最终决定在If语句中使用SDL_WaitEvent()是最好的。可以想象,CPU使用率要好得多。提前考虑,我想到了SDL_PollEvent()有用的情况,并意识到某些计时器应该与SDL_PollEvent()一起使用,例如限制FPS。

以下代码在我的主线程中。虽然if(SDL_WaitEvent(&e))显着降低了CPU使用率,但并不完美。特别是,将我的系统上的Firefox与此应用程序进行比较:Firefox使用0.2%的CPU,而此应用程序使用率约为4.4%。怎么会这样?

while( !quit ) {                        // Keep running until quit
    if( SDL_WaitEvent( &e ) ) {         // Suspend until event received
        switch( e.type ) {              // Switch on event types
            case SDL_QUIT:              // User requests quit
                printf( "Shutting down...\n" );
                quit = true;
                break;
        }
    }

    SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );   // Apply image to surface
    SDL_UpdateWindowSurface( gWindow );                     // Update the surface           
}

在监控活动监视器(Mac OS X)的同时摆弄Firefox和这个应用程序后,我发现Firefox一旦活动就立即拿起CPU。这非常好,因为当Firefox是活动应用程序时,用户不会关注其他应用程序。

但是,我的应用程序坚持使用4-6%的CPU。为什么?我认为它与while(!quit)循环有关。无论是在前景还是后台,此循环始终处于活动状态。所以,我向你们这些神话般的人提出的问题是:一旦应用程序在后台,我怎样才能暂停一个特定的循环,线程甚至整个应用程序,然后一旦它返回到前台就重新启动它? View code paste here。代码中使用的位图可以在lazy foo的教程中找到,或者你可以制作自己的640 x 480位图,只要它在代码中正确引用即可。请参阅文件顶部的const char* BMPimage = "x.bmp"

0 个答案:

没有答案