表面和纹理之间的区别(SDL/一般)
Posted
技术标签:
【中文标题】表面和纹理之间的区别(SDL/一般)【英文标题】:Difference between surface and texture (SDL / general) 【发布时间】:2014-02-18 23:50:58 【问题描述】:谁能用简单的话向我解释一下纹理和表面之间的区别?我看到它在SDL2
中用作SDL_Surface
和SDL_Texture
。 SDL_Texture
是从 SDL_Surface
创建的,而 SDL_Surface
又是从图像/位图创建的。两者都是像素的集合。但我看不出它们之间的主要区别(必须用 GPU 做点什么?)
我试图用谷歌搜索,但我发现的所有解释都太复杂了,如果不深入研究计算机图形学的东西,就无法理解它们。
【问题讨论】:
在这里看看我的回答:***.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 太糟糕了,你没有在答案中写下这个。这是你的机会。
【参考方案1】:
基本上,您的假设“与 GPU 有关系?”是对的。
SDL_Surface
用于软件 渲染。通过软件渲染,正如saloomi2012 正确注意到的那样,您正在使用常规 RAM 来存储图像数据。因此,在大多数情况下,您可以直接访问与表面关联的数据缓冲区,修改其内容,即它正在使用 CPU,因此是 software 名称。
SDL_Texture
用于硬件 渲染,纹理存储在 VRAM 中,您无法像 SDL_Surface
那样直接访问它。渲染操作由 GPU 加速,在内部使用 OpenGL 或 DirectX(仅在 Windows 上可用)API,而后者又使用您的视频硬件,因此 hardware 渲染名称。
毋庸置疑,硬件渲染比软件渲染快几个数量级,应始终被视为主要选项。
【讨论】:
如果硬件加速可用,使用SDL_Surface有什么好处吗?例如。对于小型渲染操作,去硬件的开销是否太大? @Timmos 硬件渲染总是比软件更快。但是,软件表面有一个优点:由于它存储在 CPU 可访问的主存储器中,因此您可以直接向其写入数据。如果您想实时生成纹理,例如作为视频游戏中程序生成的内容,这将很有用。 (但请注意,现在许多类型的程序生成也可以使用着色器在 GPU 上完成。) @Timmos 您可以完全控制表面的工作方式、生成方式、完全读写控制,我的意思是真的......控制是表面给您的。 OpenGL 和此类 API 需要与 GPU 一起使用,因为 GPU 制造商不允许直接访问 GPU,这就是为什么您经常会听到人们抱怨 OpenGL 或 DX 效率低下或者只是这些 API 所做的愚蠢事情,因为他们可以更快或更高效地编写一些东西,但他们不能,因为他们无法访问 GPU。 可以建议为什么SDL_FillRect
比SDL_RenderFillRect
更快?问:***.com/q/65450100/4632019【参考方案2】:
SDL_Texture
加载到视频卡的 VRAM 中,而不是常规 RAM。
【讨论】:
【参考方案3】:表面使用您的 RAM,纹理使用您的显卡,速度更快 比表面。
【讨论】:
【参考方案4】:关于这方面的更多信息:
https://thenumbat.github.io/cpp-course/sdl2/05/05.html
如上一课所述,纹理是 GPU 渲染 相当于曲面。因此,纹理几乎总是由 曲面,使用函数 SDL_CreateTextureFromSurface()。这 函数或多或少符合您的预期——参数是 渲染上下文和创建纹理的表面。与 其他创建函数,失败时返回NULL。
希望对你有帮助!
【讨论】:
以上是关于表面和纹理之间的区别(SDL/一般)的主要内容,如果未能解决你的问题,请参考以下文章