sdl软件渲染器不工作,在硬件加速工作

时间:2016-04-06 19:55:32

标签: c++ sdl sdl-2

我正在使用sdl2并尝试使用他们的软件渲染而不是他们的硬件渲染。到目前为止,我正在使用他们的硬件渲染,一切都很好。拥有软件渲染对我来说非常重要。

最大的问题是为什么软件渲染器和硬件渲染器的行为有所不同?以及如何解决它?

这是我的问题:

因此,我使用SDL_CreateSoftwareRenderer来创建渲染器渲染到表面,然后我显示实际上是窗口表面的表面。 (出于某种原因我需要表面......)。

然后在循环中进行渲染:

    SDL_SetRenderDrawColor(gRenderer, 0XFF, 0XFF, 0X00, 0XFF);
    SDL_RenderClear(gRenderer);
    SDL_SetRenderDrawColor(gRenderer, 0X0F, 0X00, 0XF0, 0XFF);
    SDL_SetRenderDrawColor(gRenderer, 0X0F, 0X00, 0XF0, 0XFF);
    SDL_Rect rect;
    rect.x = 0;
    rect.y = 5;
    rect.w = 10;
    rect.h = 2;
    SDL_RenderFillRect(gRenderer, &rect);
    std::cout << "begin" << std::endl;

    for (auto& i : zIndexOrder) {
        //Rectangles[i]->get_x();
        Rectangles[i]->updat_move_fnct();
        if (Rectangles[i]->everyframe_fct != NULL)Rectangles[i]->everyframe_fct(Rectangles[i]);
        //Rectangles[i]->index_th = i;
    }
    for (auto u : Underwindows)u->Refresh();

    for (auto& i : zIndexOrder)Rectangles[i]->draw(this);


    SDL_SetRenderDrawColor(gRenderer, 0X0F, 0X00, 0XF0, 0XFF);
    rect.x = 0;
    rect.y = 5;
    rect.w = 5;
    rect.h = 5;
    SDL_RenderFillRect(gRenderer, &rect);

    std::cout << "true RENDERER " << gRenderer << std::endl;

    if (SOFTWARE_RENDERING) SDL_UpdateWindowSurface(gWindow);
    else SDL_RenderPresent(gRenderer);

这里用SDL_RenderFillRect(f->get_screen_render(), &rect);绘制的两个矩形画得很好,但在ectangles[i]->draw(this);如果我拨打同一个电话它不起作用我的意思是我打电话

            SDL_SetRenderDrawColor(f->get_screen_render(), 0X0F, 0X00, 0XF0, 0XFF);
            SDL_Rect rect;
            rect.x = 6;
            rect.y = 5;
            rect.w = 10;
            rect.h = 55;
            SDL_RenderFillRect(f->get_screen_render(), &rect);
<{1>}中的

,矩形不会绘制。

注意三个矩形来自不同的大小以查看差异,清晰的颜色与绘制颜色不同,ectangles[i]->draw(this);给出了与另外两个调用中的渲染器相同的指针,而这部分代码是执行(我知道这要归功于控制台),最后它在另外两个绘图之间执行。

他们的原因是什么一切都适用于硬件加速渲染器而不是软件加速渲染器?

我的代码由数千个代码行组成,所以如果有人想要它帮助我,我可以把它交给他,但我不能把它放在这里。

感谢帮助^^

1 个答案:

答案 0 :(得分:0)

问题在于:

if (SOFTWARE_RENDERING) SDL_UpdateWindowSurface(gWindow);
else SDL_RenderPresent(gRenderer);

无论渲染驱动程序如何,总是调用SDL_RenderPresent