SDL_Texture
is an abstraction per GPU texture, regardless of the backend used by the renderer (DirectX, OpenGL, Vulkan, etc.). The texture is stored in VRAM (on the GPU side) and cannot be accessed directly, meaning you cannot modify it using the CPU.
To make this possible, you must first copy its data from VRAM to general RAM, use the CPU to process it, and then transfer the new content back to VRAM. Such data transfer is expensive. To modify the texture content without copying it from VRAM to RAM and back, you can use shaders, which is extremely effective.
SDL_Renderer
is an abstraction to the selected backend and gives access to a set of functions for processing images and rendering them on the back buffer of the selected backend. Again, no matter which backend is chosen (DirectX, OpenGL, Vulkan, Metal, etc.), the same set of functions is used for rendering, which is very convenient. The downside is that this feature set is relatively small and has some computational overhead.
If the type of backend is not important to you and you do not need to render complex scenes, then SDL_Renderer
is a very good solution. But if you want to, you can use the API of a specific backend manually (e.g. OpenGL) and not use the SDL renderer at all.
SDL_Surface
is a block of memory stored in general RAM containing image data. You can process it normally using the CPU, but this is inefficient compared to the capabilities of the GPU.
Yep, which still does not change the fact that a CPU with even a dozen or so cores, with SSE and AVX, has no chance against a GPU with a thousand cores specialized in image processing. The difference is thousands, if not tens of thousands of times better performance.