2

因此,当我运行该应用程序时,一切都运行顺利,但运行得越多,运行速度就越慢。我查看了它正在使用的内存,当它达到 400 mb 时,它完全停止 30 秒,然后回落到 200。

我对 SDL2 很陌生,我认为这是因为我调用的每一帧:

optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);

例如,我有很多。

问题是我不知道如何正确删除每一帧的对象,因为如果我执行 SDL_FreeSurface 我会收到错误消息。

我不会发布我的整个代码,因为它很乱,但如果你想要它,请随时询问。

你知道怎么解决吗?

4

2 回答 2

3

只是想我会把我的评论变成答案。

在您调用的代码中

optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);

每一帧,我怀疑如果你从那里删除它们,在渲染循环之外初始化它们并简单地将它们作为参数传递,你应该失去内存泄漏:原因是你只会为每个创建一个内存实例然后您可以根据需要重复使用它们。再看一遍,我怀疑你optionTS一旦做了就可以销毁optionT,这样你会节省更多的内存。(还没测试,因为我的主机这个周末刚死机,我还在重新安装驱动和VS2010)

作为一般规则,尽量不要在渲染循环中创建/销毁任何对象,这往往会很快变得又大又乱。

于 2013-11-24T16:13:57.140 回答
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 实例超出范围,表面将被释放。

我确信可以根据您的需要编写和定制更好的实现,但至少与此类似的东西可能会阻止您在未来发生泄漏。

于 2013-12-11T23:02:30.477 回答