所以当我运行这个应用程序时,在最开始的时候,所有的东西都运行得很顺利,但是运行得越多,它就越慢。我看了看它正在使用的内存,当它达到400MB时,它完全停止了30秒,然后又下降到200。
我对SDL2非常陌生,我想这是因为我调用的每一帧:
optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);例如,我有很多这样的东西。
问题是我不知道如何正确地删除每一帧的对象,因为如果我执行SDL_FreeSurface,我会得到一个错误。
我不会发布我的整个代码,因为它是一团糟,但如果你想要它,请随时提出。
你知道怎么解决吗?
发布于 2013-11-25 00:13:57
我只是想把我的评论变成一个答案。
在您的代码中调用
optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);每一帧,我怀疑如果你从那里移除它们,用渲染循环初始化它们,并简单地将它们作为参数传递,你应该会避免内存泄漏:原因是你只会创建每个帧的一个内存实例,然后你可以根据需要重复使用它们。再看一遍,我怀疑一旦创建了optionT,就可以销毁optionTS,这样就可以节省更多的内存。(还没有测试,因为我的主机这个周末刚刚崩溃,我还在重新安装驱动程序和VS2010)
作为一般规则,在渲染循环中尽量不创建/销毁任何对象,这往往会很快变得又大又乱。
发布于 2013-12-12 07:02:30
如果可能的话,考虑在C++中利用RAII。例如,创建一个包装SDL_Surface并在析构函数中调用SDL_FreeSurface的类。
class MySurface
{
public:
MySurface(SDL_Surface & surface) : m_surface(surface) {}
~MySurface() {SDL_FreeSurface(m_surface);}
SDL_Surface & GetSDLSurface() {return m_surface;}
private:
SDL_Surface & m_surface;
};然后,您将在每次从SDL API获取SDL_Surface时创建一个MySurface实例,并且不必担心何时或是否释放该表面。一旦你的MySurface实例超出作用域,这个表面就会被释放。
我确信可以根据您的需求编写和定制更好的实现,但至少类似于此的实现可以防止您在未来发生泄漏。
https://stackoverflow.com/questions/20145347
复制相似问题