我在做this立即获取 lazyfoo SDL 教程。
他们使用的渲染类有一些使用 SDL_Surface*
和 SDL_Texture
的图像到纹理功能。
在函数结束时,他们通过调用 SDL_FreeSurface()
“释放”创建的表面。
现在,我想知道:
- 为什么我必须完全释放 Surface(变量是局部的?)?
- 为什么让创建的Texture不调用
SDL_DestroyTexture
就可以了? - 当我破坏纹理或释放表面时,这到底意味着什么?
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;}
最佳答案
Why exactly i have to free the Surface at all (variables are local?)?
指针 loadedSurface
是局部的。实际表面不是:IMG_Load
内部有类似于malloc
的东西。与在使用 malloc
分配的内存上使用 free
的方式相同,您在使用 IMG_Load
分配的表面上使用 SDL_FreeSurface
(或SDL_CreateRGBSurface
等等)。
Why its ok to let the created Texture be without calling SDL_DestroyTexture?
SDL_DestroyTexture
被调用,在 LTexture::free
内部,由 LTexture
的析构函数调用。所以如果 loadFromFile
被调用,SDL_DestroyTexture
几乎可以保证在某个时候被调用。
What exacty does it mean when i destroy a texture or free a surface?
这与在使用 malloc
分配的内存上使用 free
或在使用 new< 分配的内存上使用
,或调用 delete
的含义相同std::unique_ptr::reset
(不带参数),等等。每个变体的作用都略有不同。如果想知道SDL_DestroyTexture
、SDL_FreeSurface
、free
等到底有什么区别,可以看源码:SDL是开源的并且有很多 free
的开源实现。
关于c++ - 如何正确使用 SDL_DestroyTexture() 等 SDL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55328678/