在处理SDL的事件有两种模式,一种是等待 SDL_WaitEvent,另一种是轮询SDL_PollEvent
目前,在网上可以查到的文章,大多数都使用了轮询,还有人指出等待有时会导致事件处理延迟。但是我在实际coding中,使用SDL_PollEvent,一运行就风扇不停的转,用top看了下,cpu占用到了99%。
实际上,使用wait已经足够,我不大清楚这种轮询机制在什么时候会用到。
以下是一个SDL_PollEvent的原型。分析一下这段程序:
在while(quit!=1)这个循环中,如果没有发生任何事件,quit始终为0,那么在用户没有任何操作的情况下,这里会无限循环,直到event发生,进入了SDL_PollEvent的循环中。
这就导致了cpu占用率达到了100%. 因此,这种方法是不可取的。
在外层有循环时,SDL_PollEvent论询是不能用的。如果单独使用,用户无操作的时候,又无法进入处理事件的部分。实在不能明白它有什么用。
我考虑是不是这个应该用在非实时处理的时候,比如while(quit!=1)循环中嵌入一个sleep(1)之类。
- void WaitKeyboard(SubWin sw){
- int quit = 0;
- SDL_Event event;
- KEYBOARDMODE kmode = COMMAND;
- while(quit!=1){
- // printf ( "waiting for keyboard action\n" );
- while( SDL_PollEvent(&event)){
-
- printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
- switch (event.type){
- case SDL_KEYDOWN:
- printf ( "tracking keydown\n" );
- kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
- break;
- case SDL_QUIT:
- printf("Stop !\n");
- quit = 1;
- break;
- }
- }
- }
- endSDL();
- }
接下来是SDL_WaitEvent的原型
在while(quit!=1)的循环中,由于SDL_WaitEvent语句,在用户未发生任何操作前,程序处于等待状态,不会进入下一次循环,这样就避免了cpu占用的问题。
这样的做法才是正确处理SDL事件的方法。
- void WaitKeyboard(SubWin sw){
- int quit = 0;
- SDL_Event event;
- KEYBOARDMODE kmode = COMMAND;
- while(quit!=1){
- // printf ( "waiting for keyboard action\n" );
- // while( SDL_PollEvent(&event)){
- SDL_WaitEvent(&event);
- printf ( "WaitKeyboard: caught keyboard %x\n", event.key.keysym.sym );
- switch (event.type){
- case SDL_KEYDOWN:
- printf ( "tracking keydown\n" );
- kmode = TrackKeyDown(sw, event.key.keysym.sym, kmode);
- break;
- case SDL_QUIT:
- printf("stop !\n");
- quit = 1;
- break;
- }
- }
- endSDL();
- }
阅读(14105) | 评论(3) | 转发(0) |