因此,当我运行应用程序时,在biginning中,每个东西都运行顺畅,但它越多,它就越慢。我查看了它正在使用的内存,当它达到400 mb时,它会完全停止30秒,然后再回到200.
我对SDL2很新,我认为这是因为我调用的每一帧:
optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);
例如,我有很多。
问题是我不知道如何正确删除每一帧的对象,因为如果我做了SDL_FreeSurface我就会收到错误。
我不会发布我的整个代码,因为它很乱,但是如果你想要它,请随意提问。
你知道如何解决这个问题吗?
答案 0 :(得分:3)
我想我会把我的评论变成答案。
在你的代码中你打电话
optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);
每一帧,我怀疑如果你从那里删除它们,用渲染循环初始化它们并简单地将它们作为参数传递,你应该丢失内存泄漏:原因是你只会创建一个内存每个实例然后你可以根据需要重复使用它们。在再次查看它时,我怀疑你可以在optionTS
之后销毁optionT
,这样你就可以节省更多的内存。 (尚未测试,因为我的主机本周末刚刚崩溃,我仍在重新安装驱动程序和VS2010)
作为一般规则,尝试而不是在渲染循环中创建/销毁任何对象,往往会变得大而乱。
答案 1 :(得分:0)
如果可能的话,考虑在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的实例超出范围,表面就会被释放。
我确信可以根据您的需求编写和定制更好的实现,但至少与此类似的东西可能会阻止您在将来发生泄漏。