0

Conway の Game of Life の SDL バージョンを作成し始めています。以前に SDL を使用したことがありますが、ピクセルに直接アクセスしたことはありません。次のコードを書きましたが、かなり遅いです。Flip の代わりに UpdateRect を使用してみましたが、両者に違いはありませんでした。SWSURFACEでSDLを初期化しました。それを改善するために私にできることはありますか?回避策を念頭に置いています(大きなピクセルにはbmpを使用するなど)。プロット配列は 640x480 の Cell オブジェクトであり、getter/setter を介してアクセスできる「生きている」メンバーを単に含んでいます。私がやりたいのは、マウスが効率的にピクセルを描画できるようにすることだけです。これを行うには OpenGL を使用する必要がありますか? 最新のハードウェアはピクセルごとのアクセスを意図していないことを認識していることを明確にしたいと思います。しかし、それが私が必要としているものなので、解決策を探しています。

while (quit == false)
    {
            int pX = 0;
            int pY = 0;
            bool did_set = false;
            if (SDL_PollEvent(&event))
            {
                    switch(event.type)
                    {
                            case SDL_MOUSEBUTTONDOWN:
                                    plot[event.button.y][event.button.x].setAlive(true);
                                    pX = event.button.x;
                                    pY = event.button.y;
                                    did_set = true;
                            break;
                            case SDL_QUIT:
                                    quit = true;
                            break;
                    }
            }

            if (did_set)
            {
                    SDL_LockSurface(screen);
                    Uint32 p = SDL_MapRGB(screen->format, 255,255,255);
                    putpixel(screen, pX, pY, p);
                    SDL_UnlockSurface(screen);
            }
            SDL_Flip(screen);
    }
4

2 に答える 2

2

「フレーム」ごとに 1 つのイベントのみを処理しています。

SDL_PollEvent() ifを a に変更してみてくださいwhile:

const Uint32 p = SDL_MapRGB(screen->format, 255,255,255);
while (quit == false)
{
    while (SDL_PollEvent(&event))
    {
        switch(event.type)
        {
        case SDL_MOUSEBUTTONDOWN:
            {
                int pX = event.button.x;
                int pY = event.button.y;
                plot[pY][pX].setAlive(true);
                SDL_LockSurface(screen);
                putpixel(screen, pX, pY, p);
                SDL_UnlockSurface(screen);
            }
            break;
        case SDL_QUIT:
            quit = true;
            break;
        }
    }

    SDL_Flip(screen);
}
于 2012-07-16T18:30:50.910 に答える
1

1 つのフレームで複数のイベントを取得する可能性がありますが、一度に 1 つのみを処​​理し、次のフレームを待ちます。ほとんどすべての SDL サンプル コードで、ステートメントSDL_PollEvent内に表示されます。while

また、マウスは一度に複数のピクセルを移動できるため、古い位置から新しい位置まで線全体を描画する必要があります (たとえば、ブレゼンハムのアルゴリズムを使用)。この時点では、 の使用は避けた方がよいでしょう。putpixelこれは、実際には列と行に沿って歩いているときにメモリ内の位置を取得するために乗算全体を行うためです (これは足し算だけで実行できます)。

于 2012-07-16T18:31:34.577 に答える