使用 SDL2 和 SDL_image 加载 C++ 图像

C++ image loading with SDL2 and SDL_image

我对使用 SDL_image 库在 SDL2 中加载图像有疑问。

很遗憾,我在 SDL_image 文档中找不到任何关于 IMG_LoadTexture 的信息。 那么使用 IMG_LoadTexture 直接加载 PNG 图像作为纹理和使用 IMG_Load 加载表面然后使用 SDL_CreateTextureFromSurface 将其转换为纹理有什么区别?使用一个比另一个有什么好处吗?

我刚刚用 SDL 编写了一个 GUI。所以 IMG_Load 是从 SDL 1 加载 SDL 图像的旧方法,我相信。它过去的工作方式是你有 SDL 表面,然后你将它们合并在一起,然后将它们 blit 到屏幕,或者使用掩码等将表面的部分 blit 到其他表面。问题是一些东西- 例如画线,现在需要渲染器。

渲染器引入了 SDL2 的新功能。这也意味着您不能只将表面 blit 成纹理而不先转换它。

因此,总而言之,如果您可以使用 IMG_load 并使用旧的 SDL 功能,那么请这样做,因为它更直观。如果您打算绘制任何线条,或任何使用 SDL 渲染器的东西,那么您将需要学习如何在表面和纹理之间进行转换!

关于你最初的问题,因为我意识到我没有很好地回答它,通常最好使用正确的函数调用,例如直接使用 IMG_LoadTexture,而不是 IMG_Load 和然后将其转换为纹理。 SDL 直接与硬件对话并进行了惊人的优化。将表面转换为纹理,大概涉及 blitting,这意味着复制大量内存。

但是,在撰写本文时,在这种情况下似乎完全没有区别。 IMG_LoadTexture 函数做同样的事情。

但再一次检查一下,您可能根本不需要纹理,如果不需要,您可以节省一些工作;)

如有疑问,请检查来源(可在 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;
}