Как правильно использовать функции SDL, такие как SDL_DestroyTexture ()? - PullRequest
0 голосов
/ 25 марта 2019

Я делаю этот учебник lazyfoo SDL прямо сейчас.

Используемый ими класс рендеринга имеет функцию преобразования изображения в текстуру, которая использует SDL_Surface* и SDL_Texture. В конце функции они «освобождают» созданную поверхность, вызывая SDL_FreeSurface().

Теперь мне интересно:

  1. Почему мне вообще нужно освобождать поверхность (переменные локальные?)?
  2. Почему нормально, чтобы созданная Текстура оставалась без вызова SDL_DestroyTexture?
  3. Что именно это означает, когда я уничтожаю текстуру или освобождаю поверхность?
    bool Tile::loadTexture(const char* path){  
    SDL_Texture* newTexture = NULL;  
    SDL_Surface* loadedSurface = IMG_Load(path);  
    //...some code  
    Texture = newTexture;  
    SDL_FreeSurface(loadedSurface);         
    return Texture != NULL;} 

1 Ответ

1 голос
/ 26 марта 2019

Почему именно я должен вообще освободить поверхность (переменные являются локальными?)?

Указатель loadedSurface является локальным.Фактическая поверхность не такова: внутри IMG_Load есть нечто похожее на malloc.Так же, как вы используете free для памяти, выделенной с помощью malloc, вы используете SDL_FreeSurface для поверхностей, выделенных с помощью IMG_Load (или SDL_CreateRGBSurface и т. Д.).

Почему все нормальнопозволить созданной текстуре быть без вызова SDL_DestroyTexture?

SDL_DestroyTexture вызывается внутри LTexture::free, который вызывается деструктором LTexture.Так что SDL_DestroyTexture гарантированно будет вызываться в какой-то момент, если вызван loadFromFile.

Что именно это означает, когда я уничтожаю текстуру или освобождаю поверхность?

Это означает то же самое, что использование free в памяти, выделенной с помощью malloc, или использование delete в памяти, выделенной с помощью new, или вызов std::unique_ptr::reset (без аргумента) и так далее.Каждый вариант делает что-то свое.Если вы хотите узнать, что именно отличается между SDL_DestroyTexture, SDL_FreeSurface, free и т. Д., Вы можете взглянуть на исходный код: SDL является открытым исходным кодом, и существует довольно много реализаций с открытым исходным кодом free..

...