每个纹理在SDL中是否都有自己的专用渲染器?

时间:2018-05-31 02:24:46

标签: sdl sdl-2

我试图学习SDL2并且从实际角度来看遇到了困难。我觉得我从抽象的角度很好地理解了SDL窗口,渲染器和纹理。但是,我觉得我需要更多地了解引擎盖下的内容,以便恰当地使用它们。

例如,在创建纹理时,我需要提供对渲染器的引用。我发现这很奇怪。纹理似乎是加载到VRAM中的资源。为什么我需要为资源提供渲染器的引用?我理解为什么有必要给渲染器一个纹理的引用,但反之亦然,它没有任何意义。

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

我觉得一条路线与另一条路线相比会产生影响。

1 个答案:

答案 0 :(得分:4)

简短答案

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

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

正如@keltar正确指出的那样,渲染器的任何一个都不会使用由于SDL_RenderCopy签入而使用不同渲染器创建的纹理。但是,这绝对是保持事物一致性的API要求,我的观点是要强调即使不存在该检查也不适用于OpenGL之类的后端,但没有技术原因它不适用于软件渲染器

有关SDL_Renderer

的一些详细信息

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

OpenGL限制示例

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

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

  1.   

    共享只能在同一个OpenGL实现中进行

  2. 这意味着你肯定无法在使用OpenGL的SDL_Renderer和使用其他后端的SDL_Renderer之间进行分享。

    1.   

      您可以在不同的OpenGL上下文之间共享数据   ...   这是使用OS特定扩展

      完成的
    2. 由于SDL是跨平台的,这意味着他们必须为每个平台编写特殊代码来支持这一点,并且所有OpenGL实现可能根本不支持它,因此SDL更好地不支持它。

      1.   

        每个额外的渲染上下文都会对应用程序产生重大影响   性能

      2. 虽然不是限制,但为SDL添加对共享纹理的支持是不值得的。

        最后注意:SDL中的'S'代表“简单”。如果您需要在上下文之间共享数据,那么SDL只是错误的工具。