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

sdl software renderer not working , works in hardware accelerated one

本文关键字:工作 一个 硬件加速 软件 sdl      更新时间:2023-10-16

我正在使用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);

在CCD_ 4中并且矩形不绘制。

请注意,这三个矩形的大小不同,可以看出差异,清晰的颜色与绘制颜色不同,f->get_screen_render()为渲染器提供了与其他两个调用中的指针相同的指针,这部分代码是执行的(我知道这一点要感谢控制台),最后它在其他两个绘制之间执行。

它们可能是为什么所有东西都能使用硬件加速渲染器而不是软件渲染器的原因吗?

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

感谢您的帮助^^

问题就在这里:

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

无论渲染驱动程序是什么,都应该始终调用SDL_RenderPresent。

相关文章: