【问题标题】:SDL2 Segfaults - Implementing a rendererSDL2 Segfaults - 实现渲染器
【发布时间】:2020-05-02 20:52:32
【问题描述】:

刚刚在我的引擎中实现了一个 SDL_Renderer

state_t init_rend(window_t *context,flag_t flags) {
        rend.renderer = NULL;
        rend.renderer = SDL_CreateRenderer(context,-1,flags);
        rend.index = -1;

        if (rend.renderer != NULL) {
                return TRUE;
        } else {
                return FALSE;
        }
}

在我的客户端/测试应用中:

 // Init Base2D game
        init_env(VIDEO|AUDIO);

        // Init Display display
        init_disp(640,480,"Display",RESIZABLE|VISIBLE,make_color(255,255,255,255));

        // Init Renderer renderer
        init_rend(display->window,SOFTWARE);

        // Game Loop
        state_t status;
        while (TRUE) {
                update();
                status = listen();
                if (!status) {
                        break;
                }
                /* User Event Handles */
        }

我可以通过以下方式成功处理窗口大小调整:

void resize_window() {
        printf("I was here!\n");
        SDL_FreeSurface(display->container);
        printf("Now I am here\n");
        display->container = SDL_GetWindowSurface(display->window);
        SDL_FillRect(
                display->container,
                NULL,
                SDL_MapRGBA(
                        display->container->format,
                        get_red(),
                        get_green(),
                        get_blue(),
                        get_alpha()
                )
        );
}

但是,由于我已经实现了渲染器,每当我尝试调整我的显示大小时,它都会在尝试SDL_FreeSurface(display->container) 时出现段错误。

正如我所提到的,在我实现渲染器之前,调整大小工作正常。

为什么会这样?

【问题讨论】:

标签: sdl game-engine renderer


【解决方案1】:

按照用户提供的链接:keltar,

在我看来,使用 SDL2 的方法是使用渲染器绘制到窗口,而不是使用表面的旧 SDL1 方法。

我就是这样做的,删除了 surface 代码并只使用了渲染器,代码可以正常工作

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多