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

C 表面和纹理之间的差异(SDL/常规),c,graphics,sdl,sdl-2,C,Graphics,Sdl,Sdl 2,有人能用简单的话向我解释一下纹理和表面的区别吗?我在SDL2中看到它被用作SDL\u表面和SDL\u纹理SDL_纹理是从SDL_曲面创建的,而SDL_曲面又是从图像/位图创建的。两者都是像素的集合。但我看不出它们之间的主要区别(是否与GPU有关?) 我试着用谷歌搜索它,但我发现的所有解释都太复杂了,如果不深入研究计算机图形学的内容,就无法理解它们。SDL\u纹理被加载到视频卡的VRAM中,而不是普通的RAM中 基本上,你的假设“与GPU有关吗?”是正确的 SDL_曲面用于软件渲染。正如正确注意到

有人能用简单的话向我解释一下纹理和表面的区别吗?我在
SDL2
中看到它被用作
SDL\u表面
SDL\u纹理
SDL_纹理
是从
SDL_曲面
创建的,而SDL_曲面又是从图像/位图创建的。两者都是像素的集合。但我看不出它们之间的主要区别(是否与GPU有关?)


我试着用谷歌搜索它,但我发现的所有解释都太复杂了,如果不深入研究计算机图形学的内容,就无法理解它们。

SDL\u纹理
被加载到视频卡的VRAM中,而不是普通的RAM中

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

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

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


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

曲面使用RAM,纹理使用速度更快的视频卡
而不是表面。

关于这方面的更多信息,请参见:

如上一课所述,纹理是GPU渲染的基础 等效于曲面。因此,纹理几乎总是从中创建的 曲面,使用函数SDL_CreateTextureFromSurface()。这 函数或多或少实现了您期望的功能参数是 渲染上下文和曲面以从中创建纹理。如同 其他创建函数,失败时返回NULL


我希望它能帮助你

看看我的答案:它将解释
SDL\u纹理
SDL\u曲面
以及
SDL\u渲染器
。一般来说,
SDL_纹理
是用于渲染的,但是当您使用
SDL_图像
SDL_ttf
加载纹理信息时,您将以
SDL_曲面
@olevegard的形式获得数据,这个答案几乎是一个复制粘贴,我真的希望得到一个有一定知识的答案。正如您假设的那样,
SDL_表面
只是像素的集合,而
SDL_纹理
是像素数据的高效、特定于驱动程序的表示,这意味着GPU可以使用它。这回答了你的问题吗?你真的应该深入研究计算机图形学来理解more@olevegard很遗憾你没有在你的回答中写上。这是你的机会。如果硬件加速可用,使用SDL_Surface有什么优势吗?例如,对于较小的渲染操作,转到硬件的开销太大?@Timmos硬件渲染总是比软件快。然而,软件表面有一个优点:因为它存储在CPU可访问的主内存中,所以您可以直接向它写入数据。如果您想要实时生成纹理,例如视频游戏中程序生成的内容,这将非常有用。(请记住,现在许多类型的程序生成也可以在GPU上使用着色器完成。)@Timmos您可以完全控制曲面的处理方式、生成方式、完全读写控制,我的意思是,控制是曲面提供给您的。OpenGL和这样的API需要与GPU一起工作,因为GPU制造商不允许直接访问GPU,这就是为什么你经常会听到人们抱怨OpenGL或DX的效率低下,或者只是那些API所做的愚蠢的事情,因为他们可以写得更快或更高效,但他们不能,因为他们无法访问GPU。可能会建议为什么
SDL\u FillRect
SDL\u RenderFillRect
更快?问: