【问题标题】:C++ image loading with SDL2 and SDL_image使用 SDL2 和 SDL_image 加载 C++ 图像
【发布时间】:2018-10-19 15:22:30
【问题描述】:

我有一个关于在 SDL2 中使用 SDL_image 库加载图像的问题。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,所以 IMG_LoadTexture 和 IMG_Load 加载表面然后将其转换为纹理是相同的。
    【解决方案2】:

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

    渲染器引入了 SDL2 的新功能。这也意味着您不能在不先将其转换为纹理的情况下将您的表面直接粘贴到纹理中。

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

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

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

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

    【讨论】:

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