使用 SDL_TTF 时 C++ 程序内存使用量不断增加
C++ program memory usage keeps increasing when using SDL_TTF
我正在使用 SDL 库为一个简单的游戏编写代码。我对此有 2 个问题:
如果我不打断点让程序自己运行,内存使用率会很高(比开始时高20-30倍)。但是,如果我停止循环(游戏的主循环)并自己点击,大约 100 次点击后内存使用量保持不变(?)。为什么?
所以我决定用仪器来分析原因,因为我认为在循环中我可能会添加新元素而不破坏它。每次我在 Instrument 中达到记录时,该应用程序都会继续运行 5 秒并关闭并显示崩溃报告(该应用程序运行完美,带有内存,在 xcode 中)
线程 0 崩溃::调度队列:com.apple.main-thread
0 org.libsdl.SDL2 0x0000000100f5bea9 0x100ee9000 + 470697
1 尖峰 10 0x0000000100ea40cc imageTexture::render() + 50 (imageTexture.cpp:37)
2 尖峰 10 0x0000000100ea2b70 GUI::renderImage() + 40 (GUI.cpp:140)
3 尖峰 10 0x0000000100ea30b2 GUI::run() + 1258 (GUI.cpp:172)
4 尖峰 10 0x0000000100ea439e 主 + 36 (main.cpp:15)
5 libdyld.dylib 0x00007fff8c60f5ad 开始 + 1
这些是我认为可能相关的一些代码:
对于数字 3://imageVector 只是一个包含所有 imageVector 指针的向量
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
对于数字 2:
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
经过长时间的尝试 disable/enable 代码发现发生了什么,我仍然不知道哪里出了问题。
这是我当前的循环:
while (true) {
textVector[0]->setInput(system->output());
renderImage();
renderText();
SDL_RenderPresent( gRenderer );
}
它的一些代码:
void textTexture::setInput(std::string newText) {
gText = newText;
}
void GUI::renderImage() {
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
}
void GUI::renderText() {
for (int i = 0; i < textVector.size(); i++) {
textVector[i]->render();
}
}
void textTexture::render() {
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//recreate the texture
createTextureFromRenderedText(gText);
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
}
void textTexture::createTextureFromRenderedText(std::string text) {
if (text != "") {
SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
if( textSurface == NULL )
{
printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
}
else
{
//Create texture from surface pixels
texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
if( texture == NULL )
{
printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get image dimensions
width = textSurface->w;
height = textSurface->h;
}
//Get rid of old surface
SDL_FreeSurface( textSurface );
}
}
}
找到问题所在。我复制了 lazyfoo 的样式并尝试在我的中实现,所以当我渲染新的 textTexture 时,它实际上会创建新的纹理而不破坏它。通过使用 SDL_DestroyTexture,一切正常
在这里找到答案:
我正在使用 SDL 库为一个简单的游戏编写代码。我对此有 2 个问题:
如果我不打断点让程序自己运行,内存使用率会很高(比开始时高20-30倍)。但是,如果我停止循环(游戏的主循环)并自己点击,大约 100 次点击后内存使用量保持不变(?)。为什么?
所以我决定用仪器来分析原因,因为我认为在循环中我可能会添加新元素而不破坏它。每次我在 Instrument 中达到记录时,该应用程序都会继续运行 5 秒并关闭并显示崩溃报告(该应用程序运行完美,带有内存,在 xcode 中)
线程 0 崩溃::调度队列:com.apple.main-thread
0 org.libsdl.SDL2 0x0000000100f5bea9 0x100ee9000 + 470697
1 尖峰 10 0x0000000100ea40cc imageTexture::render() + 50 (imageTexture.cpp:37)
2 尖峰 10 0x0000000100ea2b70 GUI::renderImage() + 40 (GUI.cpp:140)
3 尖峰 10 0x0000000100ea30b2 GUI::run() + 1258 (GUI.cpp:172)
4 尖峰 10 0x0000000100ea439e 主 + 36 (main.cpp:15)
5 libdyld.dylib 0x00007fff8c60f5ad 开始 + 1
这些是我认为可能相关的一些代码:
对于数字 3://imageVector 只是一个包含所有 imageVector 指针的向量
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
对于数字 2:
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
经过长时间的尝试 disable/enable 代码发现发生了什么,我仍然不知道哪里出了问题。
这是我当前的循环:
while (true) {
textVector[0]->setInput(system->output());
renderImage();
renderText();
SDL_RenderPresent( gRenderer );
}
它的一些代码:
void textTexture::setInput(std::string newText) {
gText = newText;
}
void GUI::renderImage() {
SDL_RenderClear( gRenderer );
for (int i = 0; i < imageVector.size(); i++) {
imageVector[i]->render();
}
}
void GUI::renderText() {
for (int i = 0; i < textVector.size(); i++) {
textVector[i]->render();
}
}
void textTexture::render() {
//set rendering space and render to screen
SDL_Rect temp = {x, y, width, height};
//recreate the texture
createTextureFromRenderedText(gText);
//render to the screen
SDL_RenderCopy(gRenderer, texture, NULL, &temp);
}
void textTexture::createTextureFromRenderedText(std::string text) {
if (text != "") {
SDL_Surface* textSurface = TTF_RenderText_Blended_Wrapped(gFont, text.c_str(), textColor, 600);
if( textSurface == NULL )
{
printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
}
else
{
//Create texture from surface pixels
texture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
if( texture == NULL )
{
printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get image dimensions
width = textSurface->w;
height = textSurface->h;
}
//Get rid of old surface
SDL_FreeSurface( textSurface );
}
}
}
找到问题所在。我复制了 lazyfoo 的样式并尝试在我的中实现,所以当我渲染新的 textTexture 时,它实际上会创建新的纹理而不破坏它。通过使用 SDL_DestroyTexture,一切正常
在这里找到答案: