代码之家  ›  专栏  ›  技术社区  ›  Izzo

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

  •  1
  • Izzo  · 技术社区  · 7 年前

    我正在尝试学习SDL2,从实际的角度来看有困难。我觉得从抽象的角度对sdl窗口、渲染器和纹理有很好的理解。不过,我觉得我需要更多地了解引擎盖下的情况,以便正确使用它们。

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

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

    我觉得走一条路对另一条路有后果。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Brad Allred    7 年前

    简短的回答

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

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


    正如@keltar正确指出的那样,由于签入,渲染器无法处理使用其他渲染器创建的纹理 SDL_RenderCopy 。然而,这是一个严格的api要求,以保持一致性,我在上面的观点是强调,即使没有检查,它也不会工作的后端,如opengl,但没有技术原因,它不会工作的软件渲染器。


    sdl_渲染器的一些细节

    记住这一点 SDL_渲染器 是一个抽象接口到多个可能的后端(opengl,opengles,d3d,metal,software,more?)。每一个都可能对上下文之间共享数据有限制,因此sdl必须以同样的方式限制自己以保持健全。

    OpenGL限制示例

    Here 对于opengl上下文的一般限制和依赖于平台的功能来说,是一个很好的资源。

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

    1. 共享只能在同一个opengl实现中发生

    这意味着你肯定不能在 SDL_渲染器 使用opengl SDL_渲染器 使用另一个后端。

    1. 您可以在不同的opengl上下文之间共享数据 … 这是使用特定于操作系统的扩展来完成的

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

    1. 每个额外的呈现上下文都会对应用程序产生重大影响 性能

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

    最后注意:sdl中的s代表“simple”。如果你需要在上下文之间共享数据,sdl就是一个错误的工具。