C ++ загрузка изображений с SDL2 и SDL_image - PullRequest
0 голосов
/ 19 октября 2018

У меня есть вопрос о загрузке изображений в SDL2 с помощью библиотеки SDL_image.

К сожалению, я не нахожу никакой информации о IMG_LoadTexture в документации по SDL_image.Так в чем же разница между использованием IMG_LoadTexture для прямой загрузки изображения PNG в качестве текстуры и использованием IMG_Load для загрузки поверхности, а затем преобразовать ее в текстуру с помощью SDL_CreateTextureFromSurface?Есть ли преимущество в использовании одного над другим?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Если сомневаетесь, проверьте источник (легко просматривается на 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;
}
0 голосов
/ 19 октября 2018

Я только что закончил писать графический интерфейс в SDL.Так что IMG_Load - это старый способ загрузки изображений SDL, начиная с SDL 1, я верю.Он работал так, что у вас есть SDL-поверхности, а затем вы объединяете их вместе, а затем перетаскиваете их на экран или разбиваете участки поверхностей на другие поверхности, используя маски и т. Д. Проблема в том, что некоторые вещи- например, для рисования линий теперь требуется средство визуализации.

Средства визуализации используют новые функции SDL2.Это также означает, что вы не можете просто разбить ваши поверхности на текстуру без предварительной конвертации.

Итак, в итоге, если вы можете избежать использования IMG_load и старых функций SDL, сделайте это, потому что это более интуитивно понятно.Если вы планируете вообще рисовать какие-либо линии или что-либо, использующее средство визуализации SDL, вам нужно научиться конвертировать поверхности и текстуры!

Относительно вашего исходного вопроса, потому что я понимаю, чтоЯ не очень хорошо отвечаю, обычно лучше использовать правильные вызовы функций, такие как IMG_LoadTexture напрямую, а не IMG_Load, а затем преобразовать их в текстуру.SDL напрямую взаимодействует с аппаратным обеспечением и обладает удивительной оптимизацией.Преобразование поверхности в текстуру, по-видимому, включает блиттинг, что означает копирование значительного объема памяти.

Однако, похоже, что в этом случае на момент написания этого, разницы нет абсолютно.Функция IMG_LoadTexture делает то же самое.

Но еще раз, проверьте, вам могут вообще не понадобиться текстуры, если нет, вы можете сэкономить себе немного работы;)

...