2012-04-22 103 views
3

如果我没有记错,我以前遇到过这个问题,但我不记得我是如何解决它的。 这是我的计划:SDL显着延迟的视频更新

#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

它在我的机器(windows7)上正常工作。你尝试过双缓冲吗?您也不需要每次迭代执行'SDL_FillRect()',只有当鼠标被点击时(甚至可以改变单个像素)。 – jrok 2012-04-24 11:50:20

回答

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);
  • 更新旧的白色像素为黑色,而不是填充黑色的所有画面。 (1)循环结束之前添加SDL_Delay(10);