SDL_PollEvent阻止渲染,除非移动窗口或调整窗口大小

时间:2018-08-23 18:44:44

标签: sdl

我有与this question类似的问题,除了我使用SDL渲染器而不是表面。我正在尝试使用ffmpeg渲染视频,但是无论我尝试渲染什么都没关系,即使简单的SDL_Rect也无法正常工作。我只会看到黑屏,除非我移动窗口或调整窗口大小,否则它将立即开始渲染。如果我删除SDL_PollEvent,它将正确呈现。我还尝试使用软件渲染器,其行为方式相同。将渲染置于单独的线程中也无济于事。

我在通过Homebrew安装了SDL2的macOS上。

SDL_Window *win = nullptr;
SDL_Renderer *renderer = nullptr;

SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_TIMER|SDL_INIT_EVENTS);

win = SDL_CreateWindow("Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_RESIZABLE|SDL_WINDOW_ALLOW_HIGHDPI);
renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);

while (true) {
    SDL_Event e;
    if (SDL_PollEvent(&e)) {
        if (e.type == SDL_QUIT) {
            break;
        }
    }

    // update texture data via ffmpeg
    // (code omitted)

    // render
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, video_texture, nullptr, nullptr);
    SDL_RenderPresent(renderer);
}

3 个答案:

答案 0 :(得分:1)

经过一些额外的调试后,即使在挖掘SDL源并在运行时查看SDL_Window和SDL_Renderer结构后,我也找不到任何证据。我目前正在使用Mojave Beta,但之前在High Sierra上也观察到相同的行为。我尝试使用SDL 2.0.8中引入的 Metal 驱动程序创建渲染器,并且现在可以正常使用,与OpenGL相比,我发现SDL运行时结构没有差异,这使我怀疑这是操作系统问题。因此,我建议尽可能在Mac上使用Metal渲染器作为解决方案。毕竟,这是Apple唯一支持的API。

答案 1 :(得分:1)

我遇到了同样的问题,并使用SDL2.framework运行时二进制文件对其进行了修复,该二进制文件可以直接从SDL网站here下载,而不是brew上的软件包。

答案 2 :(得分:1)

这可能是SDL 2.0.9中修复的Mojave错误,如下所示:

https://bugzilla.libsdl.org/show_bug.cgi?id=4272