每个纹理都应该在 SDL 中有自己的专用渲染器吗?

Should each texture have its own dedicated renderer in SDL?

我正在尝试学习 SDL2,但从实践的角度来看遇到了困难。我觉得我从抽象的角度对SDLwindows、渲染器和纹理有了很好的理解。但是,我觉得我需要更多地了解引擎盖下发生的事情才能正确使用它们。

例如,在创建纹理时,我需要提供对渲染器的引用。我觉得这很奇怪。纹理看起来像是加载到 VRAM 中的资源。为什么我需要为资源提供对渲染器的引用?我理解为什么有必要为渲染器提供对纹理的引用,但是,反之亦然,这没有任何意义。

那么这就引出了另一个问题。由于每个纹理都需要一个渲染器,每个纹理应该有自己的专用渲染器,还是应该多个纹理共享一个渲染器?

我觉得一条路与另一条路相比会有不同的后果。

简答

我认为 SDL_Texture 需要渲染器的原因是因为一些后端实现(OpenGL?)有上下文(这本质上就是 SDL_Renderer 是什么)并且图像数据必须与之相关联特定的上下文。您不能在另一个上下文中使用在一个上下文中创建的纹理。

对于您的其他问题,不,您不需要或不想要每个纹理的渲染器。出于同样的原因(上下文),这可能只会在软件后端产生正确的结果。


正如@keltar 正确指出的那样,none 的渲染器将使用由于签入 SDL_RenderCopy 而使用不同渲染器创建的纹理。然而,这严格来说是保持一致的 API 要求,我上面的观点是要强调即使没有该检查它也不适用于 OpenGL 等后端,但没有技术原因它不起作用对于软件渲染器。


关于SDL_Renderer

的一些细节

请记住,SDL_Renderer 是多个可能的后端(OpenGL、OpenGLES、D3D、Metal、软件等等?)的抽象接口。这些中的每一个都可能对在上下文之间共享数据有限制,因此 SDL 必须以相同的方式限制自己以保持理智。

OpenGL 限制示例

Here 是关于 OpenGL 上下文的一般限制和平台相关功能的良好资源。

从该页面可以看出,上下文之间的共享有限制。

  1. Sharing can only occur in the same OpenGL implementation

这意味着您当然不能在使用 OpenGL 的 SDL_Renderer 和使用其他后端的不同 SDL_Renderer 之间共享。

  1. You can share data between different OpenGL Contexts ... This is done using OS Specific extensions

由于 SDL 是跨平台的,这意味着他们必须为每个平台编写特殊代码来支持它,而所有 OpenGL 实现可能根本不支持它,所以 SDL 最好也不支持它。

  1. each extra render context has a major impact of the applications performance

虽然不是限制,但这也是为什么不值得为 SDL 添加对共享纹理的支持的原因。

最后说明:SDL中的'S'代表"simple"。如果您需要在上下文之间共享数据,SDL 是不适合这项工作的工具。