如果我没记错的话,我之前遇到过这个问题,但我不记得我是怎么解决的。 这是我的计划:
#include "SDL.h"
SDL_Surface *screen;
SDL_Event event;
int main(int argc,char *argv[])
{
SDL_Init(SDL_INIT_VIDEO);
atexit(SDL_Quit);
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
int x = 10,y = 10;
while (1)
{
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
exit(0);
}
int mx,my;
Uint8 mstate = SDL_GetMouseState(&mx,&my);
if (mstate & SDL_BUTTON(1)) x = mx,y = my;
SDL_FillRect(screen,NULL,0);
*(Uint32*)((Uint8*)screen->pixels+screen->pitch*y+x*sizeof(Uint32)) = 0xFFFFFFFF;
SDL_UpdateRect(screen,0,0,0,0);
}
}
黑色背景中有一个白色像素,当您按下鼠标左键时,它会移动到鼠标光标的位置。问题是,在像素出现在新位置之前需要很长一段时间。这个像素不是问题。当我尝试移动程序窗口时,它也不会立即响应。如果我把它放在while(SDL_PollEvent(& event))循环中的某个地方,函数printf也没有。另一方面,如果我对SDL_SetVideoMode执行相同操作,它会在事件发生时响应。 此外,这仅在FPS和分辨率足够高时才会发生。如果我将视频模式设置为320x200而不是640x480,或者限制FPS,则一切都会按时发生。 顺便说一句,我使用Ubuntu 11.10与Mesa图形驱动程序。 那么这个问题是SDL或其他软件的错误还是我的错?
答案 0 :(得分:0)
它在我的电脑上工作正常(windows7),while (1)
内的执行时间不到1ms。
当您将视频模式设置为较低分辨率时,一切都按时发生的事实导致您的计算机资源不足和/或Ubuntu 11.10 with Mesa graphics drivers
上的未经优化的功能。
您需要分析每个函数使用的CPU时间,以便找到瓶颈。
一些想法:
if (mstate & SDL_BUTTON(1))
SDL_UpdateRect(screen,x,y,1,1);
SDL_Delay(10);
。