【问题标题】:Should each texture have its own dedicated renderer in SDL?每个纹理都应该在 SDL 中拥有自己的专用渲染器吗?
【发布时间】:2018-05-31 02:24:46
【问题描述】:

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

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

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

我觉得沿着一条路线与另一条路线相比会产生后果。

【问题讨论】:

    标签: sdl sdl-2


    【解决方案1】:

    简答

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

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


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


    关于 SDL_Renderer 的一些细节

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

    OpenGL 限制示例

    Here 是一个很好的资源,用于了解 OpenGL 上下文的一般限制和平台相关功能。

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

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

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

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

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

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

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

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

    【讨论】:

    • 即使使用软件渲染器也不应该工作 - 检查纹理是否使用相同的渲染器创建是 RenderCopy 所做的第一件事。 hg.libsdl.org/SDL/file/757d81897470/src/render/…
    • @keltar 谢谢,我已将其添加为旁白。我试图说明的一点是,即使这些原因不适用于软件渲染,OpenGL 也无法正常工作,这会迫使 API 采用这种方式。
    • @BradAllred 在哪里可以找到这样更深入的信息?这似乎是我找到的任何教程中都没有提到的相当重要的信息。
    • @Izzo 我添加了一个 OpenGL 资源和摘要,您可能会觉得有帮助,但“更深入的信息”会因后端和操作系统而异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多