我试图学习SDL2并且从实际角度来看遇到了困难。我觉得我从抽象的角度很好地理解了SDL窗口,渲染器和纹理。但是,我觉得我需要更多地了解引擎盖下的内容,以便恰当地使用它们。
例如,在创建纹理时,我需要提供对渲染器的引用。我发现这很奇怪。纹理似乎是加载到VRAM中的资源。为什么我需要为资源提供渲染器的引用?我理解为什么有必要给渲染器一个纹理的引用,但反之亦然,它没有任何意义。
这导致了另一个问题。由于每个纹理都需要渲染器,每个纹理应该有自己的专用渲染器,还是多个纹理应该共享一个渲染器?
我觉得一条路线与另一条路线相比会产生影响。
答案 0 :(得分:4)
我认为SDL_Texture需要渲染器的原因是因为一些后端实现(OpenGL?)具有上下文(这实质上是SDL_Renderer
)并且图像数据必须与该特定上下文相关联。您不能使用在另一个上下文中创建的纹理。
对于您的其他问题,不,您不需要或想要每个纹理的渲染器。由于相同的原因(上下文),这可能只会在软件后端产生正确的结果。
正如@keltar正确指出的那样,渲染器的任何一个都不会使用由于SDL_RenderCopy
签入而使用不同渲染器创建的纹理。但是,这绝对是保持事物一致性的API要求,我的观点是要强调即使不存在该检查也不适用于OpenGL之类的后端,但没有技术原因它不适用于软件渲染器
请记住SDL_Renderer
是多个可能后端的抽象接口(OpenGL,OpenGLES,D3D,Metal,Software等等)。这些中的每一个都可能限制在上下文之间共享数据,因此SDL必须以同样的方式限制自己以保持理智。
Here是OpenGL上下文中一般限制和平台相关功能的良好资源。
从该页面可以看出,上下文之间的共享存在限制。
共享只能在同一个OpenGL实现中进行
这意味着你肯定无法在使用OpenGL的SDL_Renderer
和使用其他后端的SDL_Renderer
之间进行分享。
您可以在不同的OpenGL上下文之间共享数据 ... 这是使用OS特定扩展
完成的
由于SDL是跨平台的,这意味着他们必须为每个平台编写特殊代码来支持这一点,并且所有OpenGL实现可能根本不支持它,因此SDL更好地不支持它。
每个额外的渲染上下文都会对应用程序产生重大影响 性能
虽然不是限制,但为SDL添加对共享纹理的支持是不值得的。