我在C / C ++上使用SDL库 我有这种方法在屏幕上写文字:
//string, pos.x and pos.y
void writeText(int x, int y, char *str)
{
SDL_Surface* textSurface;
SDL_Texture *mTexture;
SDL_Color textColor = { 0XFF, 0XFF, 0XFF };
SDL_Rect src, dst;
SDL_Renderer* gRenderer = getRenderer();
textSurface = TTF_RenderText_Solid(font, str, textColor);
mTexture = SDL_CreateTextureFromSurface(gRenderer, textSurface);
src.x = 0; dst.x = x;
src.y = 0; dst.y = y;
src.w = dst.w = textSurface->w;
src.h = dst.h = textSurface->h;
SDL_RenderCopy(gRenderer, mTexture, &src, &dst);
}
我在do-while内部的main函数中使用此方法来编写播放器SCORE。这样,使内存从20MB(没有这种方法)增加到2024MB(使用此方法),然后返回"读取访问冲突"。我认为问题是这个方法在每次do-while迭代中都会创建一个对象,并且内存会在没有控制的情况下增加。
如何绕过这个?
我是C指针的新手,我尝试过这样的方法来重复使用textSurface而不在每次迭代时创建一个新对象:
SDL_Surface textSurfaceCreate() {
SDL_Surface textSurface;
return textSurface;
}
在Main上,调用类似
的内容SDL_Surface textSurface = textSurfaceCreate();
并且在do-while内部:
writeText(SDLSurface* textSurface, int x, int y, char *str);
但是当我编译时,Visual Studio给了我一些错误。
答案 0 :(得分:2)
可以从Visual Studio中显示错误吗?
您实际上提供了自己的解决方案。如果您对原始代码块进行了这些更改,那么每次调用此函数时您都不会创建新的SDL_Texture和SDL_Surface(我认为每帧一次),那么您将无法体验到记忆增加。你可以简单地在你的函数之外设置你的表面和纹理,在其他地方并将它们传递给函数,例如:
SDL_Surface* textSurface = nullptr;
SDL_Texture* mTexture = nullptr;
void writeText(SDL_Surface* surface, SDL_Texture* texture, int x, int y, char *str)
{
SDL_Color textColor = { 0XFF, 0XFF, 0XFF };
SDL_Rect src, dst;
SDL_Renderer* gRenderer = getRenderer();
surface = TTF_RenderText_Solid(font, str, textColor);
texture = SDL_CreateTextureFromSurface(gRenderer, surface);
src.x = 0; dst.x = x;
src.y = 0; dst.y = y;
src.w = dst.w = surface->w;
src.h = dst.h = surface->h;
SDL_RenderCopy(gRenderer, texture, &src, &dst);
}
如果您不想这样做,那么您可以在绘制调用后创建并销毁此函数末尾的纹理和曲面。我相信该函数将类似于SDL_DestroySurface()和SDL_DestroyTexture()。