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

SDL_PollEvent prevents render unless window moved or resized

我有与 类似的问题,只是我使用 SDL 渲染器而不是表面。我正在尝试使用 ffmpeg 渲染视频,但我尝试渲染的内容并不重要,即使是简单的 SDL_Rect 也不起作用。我只看到黑屏 ,除非我移动或调整大小 window,然后它会立即开始渲染。如果我删除 SDL_PollEvent 它会正确呈现。我也尝试过使用软件渲染器,它的行为方式相同。将渲染放入单独的线程也无济于事。

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

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);
}

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

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

这可能是在 SDL 2.0.9 中修复的 Mojave 错误,首先:

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