我正在尝试使用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次之后崩溃,无论我想要它的速度如何(在蛇中,当你得分时一切都变得更快)。
我不知道问题出在哪里,也不知道错误信息究竟是什么意思。
如果您有任何想法,或者我的问题制定不当,请告诉我。我查看了几个论坛,发现与我的案件无关,我现在可以使用任何帮助!
提前致谢
答案 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/
)的打开文件句柄数。