我有一个关于使用 SDL_image 库在 SDL2 中加载图像的问题。
不幸的是,我在 SDL_image 文档中找不到有关 IMG_LoadTexture 的任何信息。那么使用 IMG_LoadTexture 直接将 PNG 图像加载为纹理和使用 IMG_Load 加载表面然后使用 SDL_CreateTextureFromSurface 将其转换为纹理之间有什么区别?使用其中一个有什么好处吗?
如有疑问,请检查源代码(可在https://hg.libsdl.org/轻松浏览) - https://hg.libsdl.org/SDL_image/file/ca95d0e31aec/IMG.c#l209:
SDL_Texture *IMG_LoadTexture(SDL_Renderer *renderer, const char *file)
{
SDL_Texture *texture = NULL;
SDL_Surface *surface = IMG_Load(file);
if (surface) {
texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
}
return texture;
}
我刚刚用 SDL 编写了一个 GUI。所以 IMG_Load 是加载 SDL 图像的旧方法,我相信来自 SDL 1。它过去的工作方式是你有 SDL 表面,然后你将它们合并在一起,然后将它们blit到屏幕上,或者使用遮罩等将表面的部分blit到其他表面。问题是一些东西- 例如画线,现在需要渲染器。
渲染器引入了 SDL2 的新功能。这也意味着您不能在不先将其转换为纹理的情况下将您的表面直接粘贴到纹理中。
因此,总而言之,如果您可以摆脱使用 IMG_load 和使用旧的 SDL 功能,那么这样做是因为它更直观。如果您打算绘制任何线条,或者任何使用 SDL 渲染器的东西,那么您需要学习如何在表面和纹理之间进行转换!
关于你原来的问题,因为我意识到我没有很好地回答它,通常最好直接使用正确的函数调用,例如 IMG_LoadTexture,而不是 IMG_Load 然后将其转换为纹理。SDL 直接与硬件对话,并进行了惊人的优化。将表面转换为纹理,大概涉及到 blitting,这意味着复制大量内存。
但是,在撰写本文时,这种情况似乎完全没有区别。函数 IMG_LoadTexture 做同样的事情。
但是再一次,检查一下,你可能根本不需要纹理,如果不需要,你可以为自己节省一些工作;)