我现在正在this上进行lazyfoo SDL教程。
他们使用的render类具有一些使用SDL_Surface*
和SDL_Texture
的图像到纹理功能。
在函数结束时,它们通过调用SDL_FreeSurface()
“释放”所创建的表面。
现在,我想知道:
SDL_DestroyTexture
就可以让创建的Texture正常吗? 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;}
答案 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_DestroyTexture
,SDL_FreeSurface
,free
等之间的确切区别,可以查看源代码:SDL是开源的,并且有很多开源实现的free
中的一个。