Я использую SDL2 для рисования текста, но использование памяти в Visual Studio растет линейно, пока программа не выйдет из строя. Мне сказали отключить дезинфицирующее средство адресов в свойствах проекта, но я его не включаю. Кто-нибудь знает, как решить эту проблему?
Это код, который я использую:
class Textura {
public:
Textura() {
textur = NULL;
largura = 0;
altura = 0;
};
virtual ~Textura() {};
protected:
SDL_Texture* textur;
int largura, altura;
};
class Texto : public Textura {
public:
Texto() {};
~Texto() {};
void rendTex(int x, int y, std::string textoo, SDL_Color cor, TTF_Font* fonte) {
SDL_DestroyTexture(textur);
SDL_Surface* superficie = TTF_RenderText_Solid(fonte, textoo.c_str(), cor);
textur = SDL_CreateTextureFromSurface(Janela::rende, superficie);
largura = superficie->w;
altura = superficie->h;
SDL_FreeSurface(superficie);
SDL_Rect quadrado = { x, y, largura, altura };
SDL_RenderCopy(Janela::rende, textur, nullptr, &quadrado);
}
};
int main(int argc, char* args[]) {
bool fim = false;
Texto tex1;
while (!fim) {
while (SDL_PollEvent(&eve)) {}
tex1.rendTex(50,50,"This is a text",{255,255,255,0},TTF_OpenFont("arial.ttf", 22));
janela.clear();
}
return 0;
}
Как обоснованное предположение, SDL_RenderCopy(Janela::rende, textur, nullptr, &quadrado);
на самом деле не рисует, а ставит рисунок в очередь, чтобы сделать его позже. И очередь растет линейно. (Это основано на аналогичном опыте работы с другими графическими инструментами, а не с этим конкретным API). Бесконечный цикл добавления контента без «разрешения» его в реальные пиксели — это не тот вариант использования, который они могли бы оптимизировать.
@Yakk - Адам Невромонт Ну, я также использую SDL_RenderCopy для рисования изображений, но у меня нет проблем с изображениями.
Вы загружаете шрифт на каждой итерации с помощью TTF_OpenFont
, но никогда его не освобождаете.
Решение здесь состоит в том, чтобы разделить метод «rendTex» на две части. Это первая часть, которую необходимо разместить за пределами сегмента рендеринга цикла:
void Texto::CarrTextura(std::string textoo, TTF_Font* fonte, SDL_Color cor) {
SDL_DestroyTexture(textur);
SDL_Surface* superficie = TTF_RenderText_Solid(fonte, textoo.c_str(), cor);
textur = SDL_CreateTextureFromSurface(Janela::rende, superficie);
largura = superficie->w;
altura = superficie->h;
SDL_FreeSurface(superficie);
}
Это вторая часть, которая помещается в сегмент рендеринга цикла:
void Texto::rendTex(int x, int y) {
SDL_Rect quadrado = { x, y, largura, altura };
SDL_RenderCopy(Janela::rende, textur, nullptr, &quadrado);
}
@HolyBlackCat Нет. Я уничтожаю текстуру, которую создаю. Это первая строка в методе «rendTex».