2016-01-14 50 views
1

我對C/C SDL庫++和 我有這樣的方法寫在屏幕上的文字工作:TTF_RenderText_Solid使我公羊的增加,直到2GB和返回NULL

//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); 

} 

我用這個方法的主要功能在內部儘可能寫入球員得分。這使得內存從20MB(不使用此方法)增加到2024MB(使用此方法),然後返回「讀取訪問衝突」。我認爲問題在於這種方法在每次do-while迭代中創建一個對象,並且在沒有控制的情況下增加內存。

我怎樣才能繞過這個?

我是新手與C指針,我想是這樣的重用textSurface無需在每個迭代上創建一個新的對象:

SDL_Surface textSurfaceCreate() { 
    SDL_Surface textSurface; 
    return textSurface; 
} 

上主,叫像

SDL_Surface textSurface = textSurfaceCreate(); 

和內do-while:

writeText(SDLSurface* textSurface, int x, int y, char *str); 

但是當我編譯時,Visual Studio給了我一些錯誤。

回答

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()一樣。

+0

謝謝。我已經部分解決了問題。我使用了SDL_DestroyTexture(),並且內存增加速度比上一代碼慢。 SDL_DestroySurface()不存在。我可以用另一個C/C++函數刪除SDL_Surface *嗎?謝謝。 –

+0

好,我解決它。我已經使用SDL_FreeSurface()作爲SDL_Surface *。 –