SDL C ++ TTF一段时间后随机消失(并且不会再回来)

时间:2012-06-27 18:40:46

标签: c++ text sdl true-type-fonts

我正在使用SDL在c ++中制作类似Yahtzee(带有得分的骰子游戏)。这是我自己开发的第一个SDL项目。

问题可以描述为:当我开始游戏时,文字正常呈现。我可以放置分数并继续比赛。 然而,如果我等待几分钟(无论我是否还在玩),文本最终都会停止呈现。我可以继续游戏,但不会显示任何文字,并且不再显示之前显示的文字。

我对这个问题感到困惑。直到现在还没有发生,因为之前的游戏都没有足够让我注意到。

注意:我偶然发现的一件事是软件和硬件渲染。我不知道为什么,但我试图用硬件渲染,而这并没有解决问题。

另一个注意事项:代码的文本呈现部分是在for循环中的最后一部分。

我迷路了,任何人都可以帮助我吗?我会发布代码,但这很长,很荒谬,而且我不认为这是问题。

int GUI(State& GameState)
{       
apply_surface( 0, 0, background, screen ); //background
apply_surface( SCORE_X, SCORE_Y, scoreImage, screen ); //score card
apply_surface( KEPT_TRAY_X, KEPT_TRAY_Y, keptTray, screen ); //kept tray
apply_surface( TEXT_BOX_X, TEXT_BOX_Y, textBox, screen ); //text box

//Blatantly handles only the next event on the queue per frame
if( SDL_PollEvent( &event ) )
    eventHandler(GameState);

//place button
if(GameState.placeButtonClicked)
{
    apply_surface( GameState.buttonV[GameState.placeButtonClicked].x, GameState.buttonV[GameState.placeButtonClicked].y, clickedButton, screen );
}

//dice[1]
apply_surface( *GameState.diceV[1].pointX, *GameState.diceV[1].pointY, *GameState.diceV[1].surfaceValue, screen );

//dice[2]
apply_surface( *GameState.diceV[2].pointX, *GameState.diceV[2].pointY, *GameState.diceV[2].surfaceValue, screen );

//dice[3]
apply_surface( *GameState.diceV[3].pointX, *GameState.diceV[3].pointY, *GameState.diceV[3].surfaceValue, screen );

//dice[4]
apply_surface( *GameState.diceV[4].pointX, *GameState.diceV[4].pointY, *GameState.diceV[4].surfaceValue, screen );

//dice[5]
apply_surface( *GameState.diceV[5].pointX, *GameState.diceV[5].pointY, *GameState.diceV[5].surfaceValue, screen );

//rollButton
if(GameState.navV[1].clicked)
{
    apply_surface( GameState.navV[1].x, GameState.navV[1].y, rollButtonClicked, screen);
}
else
{
    apply_surface( GameState.navV[1].x, GameState.navV[1].y, rollButton, screen );
}

//endTurnButton
if(GameState.navV[2].clicked)
{
    apply_surface( GameState.navV[2].x, GameState.navV[2].y, endTurnButtonClicked, screen );
}
else
{
    apply_surface( GameState.navV[2].x, GameState.navV[2].y, endTurnButton, screen );
}

//displaying the clickedButton if a score is clicked
if(GameState.placeButtonClicked != 0)
{
    apply_surface( GameState.buttonV[GameState.placeButtonClicked].x, GameState.buttonV[GameState.placeButtonClicked].y, clickedButton, screen );
}

//displaying the scores for each "button" (each score segment)
for(int i = 1; i <= (GameState.buttonV.size() - 1); i++)
{
    if(GameState.buttonV[i].value >= 0)
    {
        message = TTF_RenderText_Solid( scoreFont, GameState.buttonV[i].valueString, scoreFontColor );
        apply_surface( GameState.buttonV[i].x + 10, GameState.buttonV[i].y + 2, message, screen );
    }
}

if( SDL_Flip( screen ) == -1 )
{
    return 1;
}

decGUICounters(GameState);

return 0;

}

2 个答案:

答案 0 :(得分:5)

我找到了浏览这个网站的答案(花了一段时间!)。希望我能用我发现的东西帮助别人:

问题是我一再重复设置新短信:

message = TTF_RenderText_Solid(etc);

当您致电TTF_RenderText_Solid()时,它会向曲面指针(消息)返回一个新曲面。但是,它并没有释放旧表面所包含的RAM。

在将新内存分配给曲面指针(消息)之前,您所要做的就是:SDL_FreeSurface(message);

这可以防止内存泄漏,从而防止内存被CPU随机删除。

TL;DR:

SDL_FreeSurface(message);

在:

message = TTF_RenderText_Solid();

答案 1 :(得分:0)

我遇到了同样的问题并解决了。 我只是想补充一下,因为有人遇到同样的问题,我们也应该破坏纹理。 这是我的代码:

void fwRenderText(const char* text,int x, int y,int iw,int ih)
{
    surfaceMessage = TTF_RenderText_Solid(Sans, text, White);
    Message = SDL_CreateTextureFromSurface(gRenderer, surfaceMessage);
    White = { 255, 255, 255, 255 };

    Message_rect.x = x;  //controls the position - x
    Message_rect.y = y;  // controls the position - y
    Message_rect.w = iw; // controls the width of the rect
    Message_rect.h = ih; // controls the height of the rect

    SDL_RenderCopy(gRenderer, Message, NULL, &Message_rect);
    SDL_DestroyTexture(Message);        // Free up texture
    SDL_FreeSurface(surfaceMessage);    // Free up surface
}