表面和纹理的区别(SDL / 通用)

106
有人能简单解释一下纹理和表面之间的区别吗?我在SDL2中看到了使用它们作为SDL_Surface和SDL_Texture。SDL_Texture是从SDL_Surface创建的,而SDL_Surface又是从图像/位图创建的。两者都是像素集合。但我没有看到它们之间的主要区别(与GPU有关?)。我尝试搜索,但是所有的解释都太复杂了,需要深入了解计算机图形学知识才能理解。

8
请看这里我的回答:https://dev59.com/yWEi5IYBdhLWcg3wueR0#21007477。它将解释`SDL_Texture`和`SDL_Surface`以及`SDL_Renderer`。一般来说,`SDL_Texture`是用于渲染的,但当您使用`SDL_Image`或`SDL_ttf`加载纹理信息时,您会得到一个`SDL_Surface`数据。 - olevegard
@olevegard 那个答案几乎是复制粘贴,我真的希望得到一些有见地的回答。 - this
5
SDL_Surface 是像素点的集合,而 SDL_Texture 则是“有效、特定于驱动程序的像素数据表示”,也就是说它可以被 GPU 使用。这个答案解决了您的问题吗?如果您想更深入地了解计算机图形学,建议您继续深入学习。 - olevegard
2
@olevegard 真可惜你没有在你的回答中写下那个。这是你的机会。 - this
4个回答

103

基本上,您的假设“与GPU有关?”是正确的。

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

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

不用说,硬件渲染比软件渲染快得多,始终应考虑作为首选选项。


5
如果有硬件加速可用,使用SDL_Surface是否有任何优势?例如,对于小的渲染操作,使用硬件加速会产生过多的开销吗? - Timmos
4
硬件渲染始终比软件快。但是,软件表面有一个优点:由于它存储在CPU可访问的主内存中,您可以直接向其写入数据。如果您想实时生成纹理,例如在视频游戏中作为程序生成的内容,这可能非常有用。(注意,现在许多类型的过程生成也可以使用着色器在GPU上完成。) - cemper93
2
@Timmos 你完全掌控表面的处理方式,生成方式,完全读写控制,我的意思是...控制就是表面给你的。OpenGL和其他API需要与GPU一起工作,因为GPU制造商不允许直接访问GPU,这就是为什么你经常会听到人们抱怨OpenGL或DX的低效率或愚蠢的事情,因为他们可以编写更快或更有效的代码,但他们不能,因为他们无法访问GPU。 - Trevor Hart
请问为什么SDL_FillRectSDL_RenderFillRect更快?Q: https://stackoverflow.com/q/65450100/4632019 - Eugen Konkov

11

SDL_Texture会被加载在您的显卡VRAM中,而不是普通RAM。


3

表面使用您的 RAM,而纹理则使用比表面更快的显卡。


2

关于此事,更多信息请参考:

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

如上一课所述,纹理是GPU渲染中表面的等效物。因此,纹理几乎总是由表面创建而来,使用函数SDL_CreateTextureFromSurface()。这个函数基本上做你所期望的事情——参数是渲染上下文和一个用于创建纹理的表面。与其他创建函数一样,如果失败它将返回NULL。

希望对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接