SDL系统内存在我的游戏中非常快速地上升

时间:2013-12-09 18:44:55

标签: c++ memory-leaks sdl

这是我的代码:

void apply_start_screen()
{
apply_surface( 0, 0, startingScreenBackground, screen );
apply_surface( ( SCREEN_WIDTH - startButton->w ) /2, 200, startButton, screen);
apply_surface( ( SCREEN_WIDTH - infoButton ->w ) /2, 450, infoButton, screen );
message = TTF_RenderText_Solid( font, "In The Jungle!", green );

apply_surface( ( SCREEN_WIDTH - message->w ) / 2, 25, message, screen );

SDL_Flip( screen );
 }

主要代码......

Mouse start( ( SCREEN_WIDTH - startButton->w ) /2,  200, 200, 200);

这是一个只使用sdl rect创建一个按钮的类,并检查它是否被按下

和问题在这里:

while( quit == false )
{
    apply_start_screen();
if( start.handle_event() == true )
{
    currentState = 1;
}
}

当前状态只是进入下一个屏幕而不用担心。 问题是apply_start_screen()会在每次使用时增加系统内存。我不懂。如果你渲染相同的图像/文本一次使用更多的内存?为什么? sdl表面是动态分配的,但我仍然渲染相同的表面,这意味着我不分配更多的内存?有什么建议 ?谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

解决方案:由于TTF_RenderText_Solid返回一个曲面而SDL_surface是一个动态分配像素的结构,问题是在apply_start_screen函数动态分配内存的每一帧上都是如此。有两种方法可以解决这个问题: 首先创建一个全局SDL_surface *消息并执行以下操作:

void apply_start_screen()
{
apply_surface( 0, 0, startingScreenBackground, screen );
apply_surface( ( SCREEN_WIDTH - startButton->w ) /2, 200, startButton, screen);
apply_surface( ( SCREEN_WIDTH - infoButton ->w ) /2, 450, infoButton, screen );
message = TTF_RenderText_Solid( font, "In The Jungle!", green );

apply_surface( ( SCREEN_WIDTH - message->w ) / 2, 25, message, screen );

    SDL_FreeSurface( message );
    message = NULL;
 }

或只是删除TTF_RendeText_Solid,因此不再创建/返回表面:

void apply_start_screen()
{
apply_surface( 0, 0, startingScreenBackground, screen );
apply_surface( ( SCREEN_WIDTH - startButton->w ) /2, 200, startButton, screen);
apply_surface( ( SCREEN_WIDTH - infoButton ->w ) /2, 450, infoButton, screen );

apply_surface( ( SCREEN_WIDTH - message->w ) / 2, 25, message, screen );

}
    main...
    message = TTF_RenderText_Solid( font, "In The Jungle!", green );
    rest of program...

希望我帮助过:)