首页 > 解决方案 > 如何正确使用 SDL_DestroyTexture() 等 SDL 函数?

问题描述

我现在正在做这个lazyfoo SDL 教程。

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

现在,我想知道:

  1. 为什么我必须完全释放 Surface(变量是本地的?)?
  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;} 

标签: c++sdl

解决方案


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

指针loadedSurface是本地的。实际表面不是:有类似于mallocinside of 的东西IMG_Loadfree与在分配的内存上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 是开源的,并且有很多开源实现。SDL_FreeSurfacefreefree


推荐阅读