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

时间:2018-10-19 15:22:31

标签: c++ sdl-2 sdl-image

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我刚刚用SDL编写了一个GUI。因此,我相信IMG_Load是从SDL 1加载SDL图像的旧方法。它过去的工作方式是先拥有SDL曲面,然后将它们合并在一起,然后将其涂抹到屏幕上,或者使用蒙版等将曲面的部分涂抹到其他表面上。问题是一些东西-例如绘制线条,现在需要渲染器。

渲染器引入了SDL2的新功能。这也意味着您不能不先转换就将表面必不可少地涂成纹理。

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

关于您的原始问题,因为我意识到我的回答不太好,通常最好直接使用正确的函数调用(例如IMG_LoadTexture),而不是IMG_Load,然后将其转换为纹理。 SDL直接与硬件对话,并且进行了令人惊讶的优化。将表面转换为纹理,大概涉及刮擦,这意味着复制大量内存。

但是,在撰写本文时,似乎在这种情况下完全没有区别。 IMG_LoadTexture函数执行的功能完全相同。

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