提高SDL的每像素访问速度

时间:2012-07-16 17:15:08

标签: c++ sdl

我开始制作康威的生命游戏的SDL版本。我之前使用过SDL,但从不直接访问像素。我编写了以下代码,它的执行速度非常慢。我尝试过使用UpdateRect而不是Flip,两者之间没有区别。我用SWSURFACE初始化了SDL。我能做些什么来改善它吗?我有解决方法(使用bmp用于更大的像素等)。绘图数组是640x480的Cell对象,它只包含一个可以通过getter / setter访问的成员'alive'。我想要做的就是让鼠标有效地绘制像素。我需要使用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);
    }

2 个答案:

答案 0 :(得分:2)

您每个“框架”只处理一个事件。

尝试将SDL_PollEvent() if更改为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);
}

答案 1 :(得分:1)

您可能在单个帧中获得多个事件,但您一次只处理一个事件,然后等待下一帧。在几乎所有SDL示例代码中,您都会在SDL_PollEvent语句中看到while

此外,鼠标一次可以移动多个像素,因此您必须将整行从旧位置绘制到新位置(例如,使用Bresenham算法);在这一点上你最好避免使用putpixel,因为当你实际上只是沿着列和行走时,它会在整个乘法中得到位置(这可以通过添加来完成)。