如何正确使用像SDL_DestroyTexture()这样的SDL函数?

时间:2019-03-24 21:18:32

标签: c++ sdl

我现在正在this上进行lazyfoo SDL教程。

他们使用的render类具有一些使用SDL_Surface*SDL_Texture的图像到纹理功能。 在函数结束时,它们通过调用SDL_FreeSurface()“释放”所创建的表面。

现在,我想知道:

  1. 为什么我必须完全释放Surface(变量是局部的?)?
  2. 为什么不用调用SDL_DestroyTexture就可以让创建的Texture正常吗?
  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 个答案:

答案 0 :(得分:1)

  

为什么我必须完全释放Surface(变量是局部的?)?

指针loadedSurface是本地的。实际表面不是:malloc内有类似于IMG_Load的东西。与在为free分配的内存上使用malloc的方式相同,在为SDL_FreeSurface(或IMG_Load等分配的表面上使用SDL_CreateRGBSurface的方式。) >

  

为什么可以在不调用SDL_DestroyTexture的情况下保留创建的Texture?

SDL_DestroyTexture内部调用

LTexture::free,由LTexture的析构函数调用。因此,如果调用了SDL_DestroyTexture,几乎可以肯定会调用loadFromFile

  

当我破坏纹理或释放表面时,这是什么意思?

这与在为free分配的内存上使用malloc或在为delete分配的内存上使用new或调用std::unique_ptr::reset(没有参数),等等。每个变体所做的事情都有很大不同。如果您想了解SDL_DestroyTextureSDL_FreeSurfacefree等之间的确切区别,可以查看源代码:SDL是开源的,并且有很多开源实现的free中的一个。