c++ - 如何正确使用 SDL_DestroyTexture() 等 SDL 函数?
问题描述
我现在正在做这个lazyfoo SDL 教程。
他们使用的渲染类有一些图像到纹理功能,它正在使用 SDL_Surface*
和 SDL_Texture
。在函数结束时,他们通过调用“释放”创建的表面SDL_FreeSurface()
。
现在,我想知道:
- 为什么我必须完全释放 Surface(变量是本地的?)?
- 为什么可以让创建的纹理不调用
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;}
解决方案
为什么我必须完全释放 Surface(变量是本地的?)?
指针loadedSurface
是本地的。实际表面不是:有类似于malloc
inside of 的东西IMG_Load
。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 是开源的,并且有很多开源实现。SDL_FreeSurface
free
free
推荐阅读
- python - 通过 numpy.random.seed 设置的随机种子是否跨子模块维护?
- c# - ISessionClient.AcceptMessageSessionAsync 中的 operationTimeout 实际上是做什么的?
- react-native - React Native 桥接器:从本机向 JS 连续发送数据?
- python - 如何检查 pip 是否可以找到 python 开发标头?
- objective-c - 无法从 Swift 代码访问 Objective-C 单例的数组
- azure - 消息折叠
- java - 在收银机程序中使用模数时遇到问题
- powershell - Select-Object 直接输出到变量
- python - 制定关于思科产品的月度报告计划
- azure-sql-database - 支持在托管 Azure SQL 数据库中创建系统数据库的版本