3

正しく覚えていれば、以前にこの問題に遭遇したことがありますが、どのように解決したか思い出せません。これは私のプログラムです:

#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と解像度が十分に高い場合にのみ発生します。ビデオモードを640x480ではなく320x200に設定したり、FPSを制限したりすると、すべてが時間どおりに行われます。ちなみに、私はMesaグラフィックスドライバーでUbuntu11.10を使用しています。それで、この問題はSDLまたは他のソフトウェアのバグですか、それとも私のせいですか?

4

1 に答える 1

0

私のコンピューター(windows7)でも問題なく動作し、内部の実行時間は1ミリ秒while (1)未満です。

ビデオ モードをより低い解像度に設定すると、すべてが時間どおりに行われるため、コンピュータのリソースが不足したり、 で最適化されていない機能が発生したりしUbuntu 11.10 with Mesa graphics driversます。

ボトルネックを見つけるには、各関数で使用される CPU 時間をプロファイリングする必要があります。

いくつかのアイデア:

  • 描画/更新関数をif (mstate & SDL_BUTTON(1))
  • 変更されたピクセルを更新します ->SDL_UpdateRect(screen,x,y,1,1);
  • 画面全体を黒で塗りつぶすのではなく、古い白のピクセルを黒に更新します。
  • SDL_Delay(10);while(1) ループの最後の直前に追加します。
于 2012-08-29T13:27:53.000 に答える