Difference between surface and texture (SDL / general)
有人可以简单地向我解释纹理和表面之间的区别吗?我看到它在SDL2中用作SDL_Surface和SDL_Texture。 SDL_Texture是从SDL_Surface创建的,而SDL_Surface是从图像/位图创建的。两者都是像素的集合。但是我看不到它们之间的主要区别(必须使用GPU做什么吗?)
我尝试用Google搜索它,但是我发现的所有解释都太复杂了,以至于无法理解它们而又不深入研究计算机图形学。
- 在这里看看我的答案:stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/??…它将解释SDL_Texture和SDL_Surface以及SDL_Renderer。通常,SDL_Texture是用于渲染的内容,但是当使用SDL_Image或SDL_ttf加载纹理信息时,您将获得数据作为SDL_Surface
-
@olevegard该答案几乎是一个复制粘贴,我真的很想知道一些答案。
-
就像您假设的那样,SDL_Surface只是像素的集合,而SDL_Texture是an efficient, driver-specific representation of pixel data意味着GPU wiki.libsdl.org/SDL_Texture可以使用它。那回答了你的问题吗?您确实应该更深入地研究计算机图形学以了解更多信息
-
@olevegard太糟糕了,您没有在答案中写出来。这是您的机会。
基本上您的假设是"必须使用GPU进行某些操作?"是正确的。
SDL_Surface用于软件渲染。借助软件渲染,如saloomi2012可以正确注意到的那样,您正在使用常规RAM存储图像数据。因此,在大多数情况下,您可以直接访问与Surface相关联的数据缓冲区,修改其内容,即它正在使用CPU,因此使用软件名称。
另一方面,
SDL_Texture用于硬件渲染,纹理存储在VRAM中,您无法像SDL_Surface那样直接访问它。 GPU通过内部使用OpenGL或DirectX(仅在Windows上可用)API来加速渲染操作,这些API依次使用您的视频硬件,因此也使用了硬件渲染名称。
不用说,硬件渲染比软件渲染快几个数量级,应该始终将其视为主要选择。
- 如果可以使用硬件加速,则使用SDL_Surface有什么好处吗?例如。对于小的渲染操作,去硬件的开销太大了吗?
-
@Timmos硬件渲染总是比软件快。但是,软件界面有一个优点:由于它存储在CPU可访问的主存储器中,因此您可以直接向其中写入数据。如果您想实时生成纹理(例如,作为视频游戏中程序生成的内容),这将很有用。 (不过请注意,如今,也可以使用着色器在GPU上完成许多类型的过程生成。)
-
@Timmos您可以完全控制表面的处理方式,生成方式,完全读写控制,我的意思是说……控制是表面给您的。 OpenGL和此类API必须与GPU配合使用,因为GPU制造商不允许直接访问GPU,这就是为什么您经常会听到人们抱怨OpenGL或DX效率低下或者只是愚蠢地使用了这些API的事情的原因,因为可以更快或更高效地编写某些东西,但是却不能,因为他们无法访问GPU。
-
可能会建议为什么SDL_FillRect比SDL_RenderFillRect更快?问:stackoverflow.com/q/65450100/4632019
SDL_Texture加载到视频卡的VRAM中,而不是常规RAM中。
有关以下内容的更多信息:
https://thenumbat.github.io/cpp-course/sdl2/05/05.html
As mentioned in the last lesson, textures are the GPU rendering
equivalent of surfaces. Hence, textures are almost always created from
surfaces, using the function SDL_CreateTextureFromSurface(). This
function more or less does what you'd expecta€"the parameters are the
rendering context and a surface to create the texture from. As with
other creation functions, it will return NULL on failure.
希望对您有帮助!
表面使用您的RAM,纹理使用您的视频卡,速度更快
比表面。