TTF_OpenFont завершается неудачно с N-й попытки
Я пытаюсь сделать игру на C, используя SDL_ttf, чтобы отображать счет каждый раз, когда обновляется диплей. Код выглядит так:
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 ответ
Похоже, вы постоянно открываете шрифт каждый раз, когда проходите через эту функцию:
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 дескрипторов файлов, а затем 1 процесс просачивается при каждом вызове TTF_OpenFont. Как только вы поднимитесь выше 1024, бум.
Вы можете проверить количество открытых файловых дескрипторов определенного процесса (<pid>
) проверяя количество файловых дескрипторов в /proc/<pid>/fd/
,