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/,

Другие вопросы по тегам