SDL_Texture
对象尽可能地存储在视频卡内存中,因此可以轻松地通过GPU加速。调整大小、阿尔法混合、抗锯齿和几乎任何计算密集型操作都可以受到这种性能提升的影响。如果您的程序需要在纹理上运行每个像素的逻辑,则建议您将纹理暂时转换为表面。也可以通过流式纹理进行解决。
编辑:
由于此答案受到了相当大的关注,我想详细说明我的建议。
如果您更喜欢使用纹理 -> 表面 -> 纹理
工作流来应用每个像素操作,请确保缓存您的最终纹理,除非您需要在每个渲染周期重新计算它。此解决方案中的纹理是使用SDL_TEXTUREACCESS_STATIC
标志创建的。
鼓励使用流式纹理(创建标志为SDL_TEXTUREACCESS_STREAMING
) 来处理源数据来自网络、设备、帧服务器或其他超出 SDL 应用程序完全控制范围以及明显缓存来自源的帧是低效或无法工作的用例。
如果使用SDL_TEXTUREACCESS_TARGET
标志创建纹理,则可以在纹理上方进行渲染。这限制了绘制操作的源,使其仅限于其他纹理,尽管这可能已经是您首先需要的内容。 "将纹理用作渲染目标"是 SDL2 中最新且支持最少的功能之一。
好奇读者的技术信息:
由于 SDL 实现的特性,前两种方法依赖于应用程序级别的读取和复制操作,尽管它们针对建议的场景进行了优化,并且对于实时应用程序来说足够快。
与在 GPU 上后处理相比,从应用程序层面复制数据几乎总是很慢的。如果您的要求比 SDL 提供的要求更严格,并且您的逻辑不依赖于某些外部像素数据源,则将从您的 SDL 表面绘制的原始 OpenGL 纹理分配并应用着色器(GPU逻辑)是明智的。
着色器是用GLSL编写的,这是一种可以编译成GPU汇编语言的语言。 硬件/GPU加速 实际上指的是在GPU核心上进行并行化处理的代码,并且使用着色器是实现渲染目的的首选方式。
注意!在SDL渲染函数和结构中使用原始的OpenGL纹理和着色器可能会导致意外的冲突或失去库提供的灵活性。
TLDR; 渲染和操作纹理比表面更快,尽管有时修改它们可能会很麻烦。