是否有理由为单个 window 使用多个 SDL 渲染器?

Would there ever be a reason to have multiple SDL renderers for a single window?

我目前正在使用 SDL2 并不断提出实用性问题。

假设我的应用程序具有单个 window。我生成一个渲染器来渲染这个 window 的纹理。截至目前,我有一个 "master" 渲染器,负责将所有内容渲染到 window。

我的问题是,是否有理由为单个 window 使用多个渲染器?目前暂时想不出。

没有理由(也没有办法)在 SDL2 中为同一个 window 创建多个渲染器,正如 keltar 在文件 src/render/render.c.

中指出的那样
if (SDL_GetRenderer(window)) {
     SDL_SetError("Renderer already associated with window");
     return NULL;
}

那么为什么 SDL_WindowSDL_Renderer 是两个独立的结构?因为多态。

让我们通过浏览 SDL2 源代码了解原因。 This is the directory src/render.

来自 the file sysrender.h :

struct SDL_Renderer
{
    const void *magic;

    void (*WindowEvent) (SDL_Renderer * renderer, const SDL_WindowEvent *event);
    int (*GetOutputSize) (SDL_Renderer * renderer, int *w, int *h);
    SDL_bool (*SupportsBlendMode)(SDL_Renderer * renderer, SDL_BlendMode blendMode);
    int (*CreateTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
    int (*SetTextureColorMod) (SDL_Renderer * renderer,
                               SDL_Texture * texture);
    int (*SetTextureAlphaMod) (SDL_Renderer * renderer,
                               SDL_Texture * texture);
    int (*SetTextureBlendMode) (SDL_Renderer * renderer,
                                SDL_Texture * texture);
    int (*RenderClear) (SDL_Renderer * renderer);

    ...
};

渲染器有很多函数指针,这些指针例如是从子目录opengl中的文件中设置的。每个驱动程序都用自己的函数定义自己的 SDL_Renderer 实例。通过这样做,SDL2实现了C中的多态性。

因此您只需要一个渲染器实例,但它应该不同于 window ; window 是 OS-特定的,而渲染器是特定于驱动程序的。