2012-04-22 7 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(&イベント))ループの途中に置いても関数printfは機能しません。一方、SDL_SetVideoModeで同じことを行うと、イベントが発生した瞬間に応答します。 また、これはFPSと解像度が十分に高い場合にのみ発生します。ビデオモードを640x480ではなく320x200に設定したり、FPSを制限したりすると、すべて時間通りに動作します。 ところで、私はUbuntu 11.10をMesaグラフィックドライバと共に使用しています。 この問題はSDLやその他のソフトウェアのバグですか、それとも私のせいですか?

+0

私のマシン(windows7)で正常に動作します。ダブルバッファリングを試みましたか?また、マウスがクリックされたときだけ(そして、単一のピクセルを変更するだけでも)、繰り返しごとに 'SDL_FillRect()'を実行する必要はありません。 – jrok

答えて

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);
  • 更新代わりに、すべての画面を黒充填の黒に古い白画素。
  • while(1)ループが終了する直前にSDL_Delay(10);を追加します。
関連する問題