2017-02-08 3 views
0

저는 꽤 작은 2D 사수 게임 인 비디오 게임을 만들고 있습니다. 최근에 장면에 약 9 개의 총알이있을 때 프레임 속도가 급격히 떨어지는 것을 보았습니다. 내 노트북은 고급 3D 게임을 처리 할 수 ​​있으며 게임은 매우 간단하므로 하드웨어가 문제가되지 않아야합니다.함수 메모리 및 CPU 사용량 분석

그래서 지금은 (한 사람당 적어도) 매우 큰 코드를 가지고 있으며, 어디에서 찾아야하는지 혼란 스럽습니다. 글 머리 기호와 관련된 함수와 클래스가 너무 많습니다. 예를 들어 렌더링 함수에 문제가 있는지 또는 업데이트 함수가 있는지 분석하는 방법을 모르겠습니다. 다른 프로그램에서 MVS 2015 디버깅 도구를 사용할 수는 있지만 게임의 경우 실용적이지 않습니다. 예를 들어 렌더링 기능 전에 중단 점을 넣으면 두 번째로 60 번 더 검사해야하며 아무 것도 입력 할 수 없습니다 그래서 나는 렌더링 함수를 테스트하는 총알을 결코 갖지 않을 것이다! 나는 작업 관리자를 사용하려고 시도했다. 그리고 각 글 머리 기호에 대해 CPU 사용량이 정말 빨라진다는 사실을 깨달았지만, 게임 속도가 느려지면 CPU의 10 % 만 사용된다!

그래서 제 질문은 다음과 같습니다

  • 내가 디버깅 도구를 사용할 수 없을 때 어떻게 기능을 분석 할 수 있습니까?

  • 왜 시스템 리소스가 여전히 사용되는 동안 게임이 느려 집니까?

+3

당신이해야 할 일은 [프로파일 링 *] (https://en.wikipedia.org/wiki/Profiling_ (computer_programming))입니다. 그렇게하면 어떤 함수가 가장 많은 시간을 들여야하는지, 아니면 가장 많이 호출되는지를 알 수 있습니다. 그런 다음 최적화를 위해 함수를 살펴볼 수 있습니다.그것이 당신이 "총알"과 관련이 있어야한다는 것을 알고 있기 때문에 당신이 좋은 출발을 가지고있는 것처럼 보이지만. –

답변

4

프로세싱 성능을 가장 많이 소비하는 부분을 확인하려면 profiler 함수를 사용해야합니다. "디버그"하지는 않지만 완료되면 보고서를 작성합니다.

Valgrind은 좋은 도구입니다.

왜 게임이 느려 집니까? 구현에 따라 다릅니다. 두 숫자를 나눈 결과를 계산하는 데 5 분이 걸리는 프로그램을 만들 수 있습니다.

+0

Visual Studio에는 자체 힙 및 CPU 프로파일 러가 있지만 커뮤니티 버전에서는 사용할 수 없을 수도 있습니다. 확실하지 않습니다. – SingerOfTheFall

+0

@SingerOfTheFall 나는 당신이 옳다고 생각합니다. 하지만 결코 사용하지 않았습니다. 보통 나는이 이유로 Windows 프로그램을 크로스 플랫폼으로 개발했습니다. 나는 리눅스에서 무료로 디버깅하고 프로파일 링한다. –

+0

저는 C++에 익숙하지 않지만, 제가 읽은 책의 대부분은 좋은 코드를 작성하는 방법에 관한 것입니다. 디버깅 도구를 사용하는 것에 관한 희귀 한 조언이 있습니다. 디버깅 및 분석에 대한 참고 자료 또는 튜토리얼이 있습니까? – shayan

0

메모리 홀에 관해서는 Valgrind가 이미 The Quantum Physicist에서 언급했듯이 훌륭한 도구입니다. 타이밍을 위해 내 자신의 작은 추적/프로파일 링 도구 (내 IDE에 아직없는 경우)를 작성합니다. 텍스트 디버깅 출력을 사용하여 짧은 메시지를 로그 파일에 작성하십시오. 다음과 같은 것 :

void HandleBullet() { 
    printf("HandleBullet START: %i", GetSysTime()); 
    // do your function stuff 
    printf("HandleBullet END: %i", GetSysTime()); // or calculate time of function directly 
} 

너무 오래 걸릴 수 있다고 생각되는 모든 기능에 해당 디버깅 메시지를 작성하십시오. 일부 실행 시간이 지나면 해당 파일을 조사하여 명백한 일이 발생했는지 확인할 수 있습니다 (어딘가에서 차단). 그렇지 않은 경우 원하는 고급 언어를 사용하여 생성 된 로그 파일의 작은 파서를 작성하여 정리하고 출력을 분석하십시오. 어떤 함수에서 소비 된 전체 시간이나 어떤 함수가 가장 오래 걸리는지와 같은 것을 계산하십시오. 너무 어렵지 않아야합니다. 로그 메시지 스타일을 고수하면 쉽게 이해할 수 있습니다.

1

우리는 비디오 게임 산업에도 종사하고 있으며, CPU 프로파일 링을 위해 PC에서 매우 단순한 도구를 사용합니다. 매우 졸 립니 다.

http://www.codersnotes.com/sleepy/

그것은 간단하지만 정말 시간을 많이 나를 도왔다. IDE에서 프로그램을 시작하고 수천 개의 샘플을 위해 아주 졸린 실행을시키고 해제하십시오!

+0

더 자세히 설명해 주시겠습니까? 이 사이트는 실제로 어떻게 작동하는지 설명하지 않습니다. 독점적이고 포괄적 인 의미는 무엇입니까? – shayan

+0

서브 루틴에 대한 모든 잠재적 호출을 포함하는 타이밍이 포함됩니다. 배타적 인 것은 그 루틴에서만 소비 된 시간입니다. 예를 들어, 'update'루틴은 프레임 시간의 50 %를 소비 할 수 있지만 루틴 자체에는 다른 루틴에 대한 호출이 포함되어있을 가능성이 큽니다. 그렇게 독점적 인 것은 불과 몇 % 일 수도 있습니다. –

+0

나는 게임을 테스트했으며, 대부분의 CPU 리소스를 사용하는 3 가지 기능이 있습니다. 79 % 독점에 대한 RtlSubscribeWnfStateChangeNotification이 맨 위에 있습니다. 내가 쓰는 대부분의 CPU 소모 함수는 0.02 %를 소비한다. Exclusive ... 이것이 내게주는 단서는 무엇인가? – shayan