2014-02-07 2 views
1

디플레이를 새로 고칠 때마다 점수를 표시하기 위해 SDL_ttf를 사용하여 C 언어로 게임을 만들려고합니다. 같은 코드는 같습니다 : 나는 게임을 시작하면 모든 것이 제대로 작동하지만N 번째 시도에서 TTF_OpenFont가 실패합니다.

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) 

을 이 문제가 있습니다. 그런 다음 나는 게임의 메인 루프에서 카운터를 사용하고 게임에 관계없이 항상 내가에서 일하기를 원하는 속도의 1,008번째 시간 이후에 충돌 (당신이 점수를 때 뱀에 모든 것이 빠르게 이동) 것을 발견했다.

어디에서 문제가 발생하는지 알 수없고 정확하게 오류 메시지의 의미도 없습니다.

아이디어가 있거나 제 질문이 제대로 작성되지 않은 경우 알려주십시오. 여러 포럼을 살펴본 결과 내 사례에 해당하는 내용이 전혀 발견되지 않았으므로 지금 어떤 도움도 사용할 수 있습니다! 사전

반복적으로이 기능을 통해 갈 때마다 글꼴을 여는 것처럼 보이는
+0

설명에서, 나는 당신이 메인 게임 루프 안에서'TTF_OpenFont'을하고 있다는 인상을받습니다. 그 맞습니까? – usr2564301

+0

아니요, 실제로이 세그먼트는 기본 루프에있는 다른 함수에 의해 호출되는 함수 안에 있습니다. 오류 메시지가 오류가 여기에 있음을 알리기 때문에 실제 코드를 제공하는 것이 너무 복잡 할 것이라고 생각했습니다. 내가 잘못 했습니까? – Zeenoth

답변

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 다른 파일이 프로세스에 의해 공개 후 1 개 과정은 TTF_OpenFont 각각의 호출에 의해 유출되는 처리가 있습니다. 1024, 이상 이동하면.

/proc/<pid>/fd/의 파일 설명자 수를 검사하여 특정 프로세스의 열린 파일 핸들 수 (<pid>)를 확인할 수 있습니다.

+0

전에 정적 선언에 대해 들어 본 적이 없었습니다. 나는 당신이 말한 것을 시도했습니다.문제는 당신이 말한 것과 정확히 같았고 지금은 프로그램이 완벽하게 실행 중입니다. 고마워요! – Zeenoth

+0

정적 선언을 조금 더 읽어보십시오. '정적'이란 문맥에 따라 여러 가지 다른 것을 의미합니다. 또한 면접관은 제 경험에서 C 관련 작업에 대한 면접 질문에 이러한 정적 사용 컨텍스트를 사용하는 것을 좋아합니다. :-) –

+0

OK 나는 그것에 대해 좀 더 읽을 것이다 ^^ 또한,/proc//fd /를보고 있었고 무엇이 안에 있었는지 살펴보고 두 개의 소켓이 있음을 알았다. 나는 네트워크와 관련이 없으며,이 두 요소가 어떻게 생겨 났는가? – Zeenoth

관련 문제