每个纹理都应该在 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 上下文的一般限制和平台相关功能的良好资源。
从该页面可以看出,上下文之间的共享有限制。
Sharing can only occur in the same OpenGL implementation
这意味着您当然不能在使用 OpenGL 的 SDL_Renderer
和使用其他后端的不同 SDL_Renderer
之间共享。
You can share data between different OpenGL Contexts
...
This is done using OS Specific extensions
由于 SDL 是跨平台的,这意味着他们必须为每个平台编写特殊代码来支持它,而所有 OpenGL 实现可能根本不支持它,所以 SDL 最好也不支持它。
each extra render context has a major impact of the applications
performance
虽然不是限制,但这也是为什么不值得为 SDL 添加对共享纹理的支持的原因。
最后说明:SDL中的'S'代表"simple"。如果您需要在上下文之间共享数据,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 上下文的一般限制和平台相关功能的良好资源。
从该页面可以看出,上下文之间的共享有限制。
Sharing can only occur in the same OpenGL implementation
这意味着您当然不能在使用 OpenGL 的 SDL_Renderer
和使用其他后端的不同 SDL_Renderer
之间共享。
You can share data between different OpenGL Contexts ... This is done using OS Specific extensions
由于 SDL 是跨平台的,这意味着他们必须为每个平台编写特殊代码来支持它,而所有 OpenGL 实现可能根本不支持它,所以 SDL 最好也不支持它。
each extra render context has a major impact of the applications performance
虽然不是限制,但这也是为什么不值得为 SDL 添加对共享纹理的支持的原因。