2012-04-22 104 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);