表面和纹理之间的差异(SDL /常规)


83

谁能用简单的词向我解释纹理和表面之间的区别是什么?我看到它用在SDL2asSDL_Surface和中SDL_TextureSDL_Texture从中SDL_Surface创建图像,然后从图像/位图中创建图像。两者都是像素的集合。但是我看不到它们之间的主要区别(是否需要对GPU进行处理?)

我试图用Google搜索它,但是我发现的所有解释都太复杂了,以至于无法理解它们而又不深入研究计算机图形学的东西。


7
看看我的答案在这里:stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/...这将解释SDL_TextureSDL_Surface以及SDL_Renderer。通常,SDL_Texture它是用于渲染的内容,但是当您使用SDL_Image或加载纹理信息时SDL_ttf,您将获得数据作为SDL_Surface
olevegard 2014年

@olevegard该答案几乎是一个复制粘贴,我真的很想知道一些答案。
这个

3
以及你认为,SDL_Surface仅仅是一个像素的集合而SDL_Texturean efficient, driver-specific representation of pixel data这意味着它可以通过GPU使用wiki.libsdl.org/SDL_Texture。那回答了你的问题吗?您确实应该更深入地研究计算机图形以了解更多信息
olevegard 2014年

2
@olevegard太糟糕了,您没有在答案中写出来。这是您的机会。
这个

Answers:


84

基本上,您的假设是“必须使用GPU做什么?” 是正确的。

SDL_Surface用于软件渲染。借助软件渲染,如saloomi2012可以正确注意到的那样,您正在使用常规RAM存储图像数据。因此,在大多数情况下,您可以直接访问与表面关联的数据缓冲区,修改其内容,即使用CPU,因此使用软件名称。

SDL_Texture另一方面,用在硬件渲染中,纹理存储在VRAM中,您不能像那样直接访问它SDL_Surface。GPU通过内部使用OpenGL或DirectX(仅在Windows上可用)API来加速渲染操作,这些API依次使用您的视频硬件,因此也使用了硬件渲染名称。

不用说,硬件渲染比软件渲染快几个数量级,应该始终将其视为主要选择。


4
如果可以使用硬件加速,则使用SDL_Surface有什么好处吗?例如,对于小的渲染操作,去硬件的开销太大了吗?
2015年

3
@Timmos硬件渲染总是比软件快。但是,软件界面有一个优点:由于它存储在CPU可访问的主存储器中,因此您可以直接向其中写入数据。如果您想实时生成纹理(例如,作为视频游戏中程序生成的内容),这将很有用。(不过,请记住,如今,也可以使用着色器在GPU上完成许多类型的过程生成。)
cemper93 '16

1
@Timmos您可以完全控制表面的处理方式,生成方式,完全读写控制,我的意思是说……控制是表面给您的。OpenGL和此类API必须与GPU配合使用,因为GPU制造商不允许直接访问GPU,这就是为什么您经常会听到人们抱怨OpenGL或DX效率低下或者只是愚蠢地使用了这些API的事情的原因,因为可以更快或更高效地编写某些东西,但是却不能,因为他们无法访问GPU。
特雷弗·哈特


2

表面会使用您的RAM,而纹理会使用比表面更快的视频卡。


1

有关更多信息,请参见:

https://thenumbat.github.io/cpp-course/sdl2/05/05.html

如上一课所述,纹理相当于GPU渲染的表面。因此,几乎总是使用函数SDL_CreateTextureFromSurface()从表面创建纹理。此功能或多或少地满足了您的期望-参数是渲染上下文和从中创建纹理的表面。与其他创建函数一样,它将在失败时返回NULL。

希望对您有帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.