0

我开始制作康威生命游戏的 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);
    }
4

2 回答 2

2

每个“帧”只处理一个事件。

尝试将 更改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

您可能在一帧中收到多个事件,但您一次只处理一个,然后等待下一帧。在几乎每个 SDL 示例代码中,您都会SDL_PollEventwhile语句中看到。

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

于 2012-07-16T18:31:34.577 回答