【问题标题】:Difference between surface and texture (SDL / general)表面和纹理之间的区别(SDL/一般)
【发布时间】:2014-02-18 23:50:58
【问题描述】:

谁能用简单的话向我解释一下纹理和表面之间的区别?我看到它在SDL2 中用作SDL_SurfaceSDL_TextureSDL_Texture 是从 SDL_Surface 创建的,而 SDL_Surface 又是从图像/位图创建的。两者都是像素的集合。但我看不出它们之间的主要区别(必须用 GPU 做点什么?)

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

【问题讨论】:

  • 在这里看看我的回答:stackoverflow.com/questions/21007329/what-is-a-sdl-renderer/… 它将解释SDL_TextureSDL_Surface 以及SDL_Renderer。通常,SDL_Texture 是用于渲染的,但是当您使用SDL_ImageSDL_ttf 加载纹理信息时,您将获得SDL_Surface 形式的数据
  • @olevegard 这个答案几乎是复制粘贴,我真的很想有一些知识的答案。
  • 正如你所假设的,SDL_Surface 只是像素的集合,而SDL_Texturean efficient, driver-specific representation of pixel data,这意味着它可以被 GPU wiki.libsdl.org/SDL_Texture 使用。这回答了你的问题吗?你真的应该更深入地研究计算机图形以了解更多
  • @olevegard 太糟糕了,你没有在答案中写下这个。这是你的机会。

标签: c graphics sdl sdl-2


【解决方案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_FillRectSDL_RenderFillRect 更快?问:stackoverflow.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。

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        相关资源
        最近更新 更多