Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提高SDL的每像素访问速度_C++_Sdl - Fatal编程技术网

C++ 提高SDL的每像素访问速度

C++ 提高SDL的每像素访问速度,c++,sdl,C++,Sdl,我开始制作康威生活游戏的SDL版本。我以前使用过SDL,但从未直接访问像素。我编写了以下代码,它的执行速度非常慢。我尝试过使用UpdateStribute而不是Flip,两者之间没有区别。我用SWSURFACE初始化了SDL。我能做些什么来改进它吗?我想到了一些解决办法(使用bmp来获得更大的像素等)。plot数组是640x480个单元格对象,其中只包含一个“活动”成员,可以通过getter/setter访问该成员。我想做的就是让鼠标高效地绘制像素。我需要使用OpenGL来完成这项工作吗?我想澄

我开始制作康威生活游戏的SDL版本。我以前使用过SDL,但从未直接访问像素。我编写了以下代码,它的执行速度非常慢。我尝试过使用UpdateStribute而不是Flip,两者之间没有区别。我用SWSURFACE初始化了SDL。我能做些什么来改进它吗?我想到了一些解决办法(使用bmp来获得更大的像素等)。plot数组是640x480个单元格对象,其中只包含一个“活动”成员,可以通过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);
    }

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

尝试将
SDL\u 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);
}

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

尝试将
SDL\u 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);
}

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


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

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


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

ch在容器中移动鼠标,并在一个位置绘制所有图形。这是一个render()函数。另外,您正在进行的比较次数,switch语句到if。。将代码分解为处理所需事件的函数或对象成员函数。并尽可能减少循环中的实际处理。执行所有这些操作,您应该会看到执行速度的显著提高。目前,您在while循环的任何迭代中发布了更新屏幕的代码,当您真正需要做的只是在关键时刻更新屏幕时,例如当鼠标移动时,以及当窗口需要重新绘制(调整大小、模糊等)时,在容器中移动鼠标,在一个地方画所有的画。这是一个render()函数。另外,您正在进行的比较次数,switch语句到if。。将代码分解为处理所需事件的函数或对象成员函数。并尽可能减少循环中的实际处理。执行所有这些操作,您应该会看到执行速度的显著提高。目前,您在while循环的任何迭代中发布了更新屏幕的代码,而实际上您需要做的只是在关键时刻更新屏幕,例如移动鼠标时,以及需要重新绘制窗口时(调整大小、模糊等)