有人能简单解释一下纹理和表面之间的区别吗?我在SDL2中看到了使用它们作为SDL_Surface和SDL_Texture。SDL_Texture是从SDL_Surface创建的,而SDL_Surface又是从图像/位图创建的。两者都是像素集合。但我没有看到它们之间的主要区别(与GPU有关?)。我尝试搜索,但是所有的解释都太复杂了,需要深入了解计算机图形学知识才能理解。
基本上,您的假设“与GPU有关?”是正确的。
SDL_Surface
用于软件渲染。 使用软件渲染时,正如saloomi2012正确指出的那样,您使用常规RAM存储图像数据。 因此,在大多数情况下,您可以直接访问与表面相关联的数据缓冲区,修改其内容,即它正在使用CPU,因此被称为软件名称。
另一方面,SDL_Texture
用于硬件渲染,纹理存储在VRAM中,您不能像使用SDL_Surface
那样直接访问它。 渲染操作由GPU加速,使用内部OpenGL或DirectX(仅在Windows上可用)API,这反过来又使用您的视频硬件,因此被称为硬件渲染名称。
不用说,硬件渲染比软件渲染快得多,始终应考虑作为首选选项。
SDL_FillRect
比SDL_RenderFillRect
更快?Q: https://stackoverflow.com/q/65450100/4632019 - Eugen KonkovSDL_Texture
会被加载在您的显卡VRAM中,而不是普通RAM。
表面使用您的 RAM,而纹理则使用比表面更快的显卡。
关于此事,更多信息请参考:
https://thenumbat.github.io/cpp-course/sdl2/05/05.html
如上一课所述,纹理是GPU渲染中表面的等效物。因此,纹理几乎总是由表面创建而来,使用函数SDL_CreateTextureFromSurface()。这个函数基本上做你所期望的事情——参数是渲染上下文和一个用于创建纹理的表面。与其他创建函数一样,如果失败它将返回NULL。
希望对您有所帮助!
SDL_Surface
是像素点的集合,而SDL_Texture
则是“有效、特定于驱动程序的像素数据表示”,也就是说它可以被 GPU 使用。这个答案解决了您的问题吗?如果您想更深入地了解计算机图形学,建议您继续深入学习。 - olevegard