TTF_OpenFont在第N次尝试时失败

时间:2014-02-07 22:22:16

标签: c fonts sdl-ttf

我正在尝试使用SDL_ttf在C中制作游戏,以便在每次刷新diplay时显示分数。代码如下:

SDL_Surface *score = NULL;

TTF_Font *font;
SDL_Color color = { 255, 255, 255 };
font = TTF_OpenFont( "/home/sophie/Bureau/snake/data/ubuntu.ttf", 28 );
if (font == NULL) {
    printf("%s\n", TTF_GetError()); 
}

score = TTF_RenderText_Solid( font, "score to display", color );

SDL_BlitSurface( score, NULL, screen, NULL );
SDL_Flip(screen);

当我启动游戏时,一切正常,但过了一段时间游戏崩溃,我收到以下错误:

Couldn't open /home/sophie/Bureau/snake/data/ubuntu.ttf
libgcc_s.so.1 must be installed for pthread_cancel to work
Abandon (core dumped)

我尝试了不同的字体,但我仍然有这个问题。 然后我在游戏的主循环中使用了一个计数器,发现游戏总是在第1008次之后崩溃,无论我想要它的速度如何(在蛇中,当你得分时一切都变得更快)。

我不知道问题出在哪里,也不知道错误信息究竟是什么意思。

如果您有任何想法,或者我的问题制定不当,请告诉我。我查看了几个论坛,发现与我的案件无关,我现在可以使用任何帮助!

提前致谢

1 个答案:

答案 0 :(得分:0)

看起来每次执行此功能时都会反复打开字体:

font = TTF_OpenFont( "/home/sophie/Bureau/snake/data/ubuntu.ttf", 28 );

虽然Jongware怀疑它可能不在主游戏循环中,但你提到在通过此代码路径执行1008次后,代码崩溃了。

正在发生的是一些资源被泄露。在第一次打开句柄并每次重新使用它时,通过调用TTF_CloseFont()(更高效)来保持资源需要释放。对字体使用static声明并初始化为NULL

static TTF_Font *font = NULL;

然后,如果尚未打开,请将其打开:

if (!font) {
    font = TTF_OpenFont( "/home/sophie/Bureau/snake/data/ubuntu.ttf", 28 );
}

这将首次初始化font,而后续的代码迭代不会不必要地重新执行该过程并泄漏资源。

您提到代码在1008次后通过此函数崩溃。这非常接近1024.当内存服务时,Linux每个进程限制为1024个文件句柄(这在内核中可能是可调的,但我之前在调试资源泄漏时遇到了这个限制)。您的进程可能会打开16个其他文件句柄,然后每次调用TTF_OpenFont时都会泄漏1个进程。一旦你超过1024,热潮

您可以通过检查<pid>中的文件描述符数来检查特定进程(/proc/<pid>/fd/)的打开文件句柄数。