2011-01-14 2 views
4

게임의 마지막 2-4 초의 FPS를 계산하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?C++ : 움직이는 FPS 계산

감사합니다.

편집 : 더 구체적으로 말하면, 1 초 단위로 타이머에 액세스 할 수 있습니다.

+1

먼저 게임의 아키텍처와 관련된 정보 (코드)를 제공해야합니다. – William

+0

멀리 너무 모호합니다. –

+0

건축물이 그리 멀지는 않습니다. 메인 루프를 통해 매번 카운터를 증가시킬 수 있고 두 번째 타이머에 액세스 할 수 있습니다. –

답변

9

최근 게시물이 없습니다. 지수 가중 이동 평균을 사용하여 거기에 대한 내 응답을 참조하십시오.

C++: Counting total frames in a game

다음은 샘플 코드입니다. 처음

:

avgFps = 1.0; // Initial value should be an estimate, but doesn't matter much. 

(마지막 두 번째 framesThisSecond에의 총 프레임 수를 가정) 모든 둘째 : 당신의 주회 돌이의 (

// Choose alpha depending on how fast or slow you want old averages to decay. 
// 0.9 is usually a good choice. 
avgFps = alpha * avgFps + (1.0 - alpha) * framesThisSecond; 
+0

특정 코드를 찾고 있는데, 가장 좋은 방법은 아닙니다. –

+0

흠, 말이되는 것 같습니다. 이 코드를 대답에 추가하면 동의 할 수 있습니다. –

+0

@ 제이 - 코드를 추가했습니다. – EmeryBerger

1

마지막 100 프레임 동안 프레임 시간의 순환 버퍼를 유지하고 평균을 유지할 수 있습니까? 그것은 "마지막 100 프레임 동안의 FPS"입니다. (아니면 최신 시간과 가장 오래된 시간을 구분하지 않으므로 99 일 것입니다.)

정확한 시스템 시간, 밀리 초 또는 그 이상을 호출하십시오.

+0

정확한 타이머에 액세스 할 수 없습니다. 두 번째 타이머는 모두 사용하고 있습니다. –

+0

타이머가 필요하지 않습니다. 그냥 시간. 그것들은 두 가지 다른 것들입니다. 예 : 많은 시스템이 밀리 초 타이머를 제공 할 수 있지만 나노 초 시간입니다. – MSalters

+0

@MSalters 미안하지만 나는 명확하지 않았습니다. 나는 시간 = 타이머, 타이머 = 시간을 의미했습니다. –

1

다음은 유용한 해결책입니다. 이것을 pseudo/C로 작성 하겠지만 아이디어를 게임 엔진에 적용 할 수 있습니다.

const int trackedTime = 3000; // 3 seconds 
int frameStartTime; // in milliseconds 
int queueAggregate = 0; 
queue<int> frameLengths; 

void onFrameStart() 
{ 
    frameStartTime = getCurrentTime(); 
} 

void onFrameEnd() 
{ 
    int frameLength = getCurrentTime() - frameStartTime; 

    frameLengths.enqueue(frameLength); 
    queueAggregate += frameLength; 

    while (queueAggregate > trackedTime) 
    { 
     int oldFrame = frameLengths.dequeue(); 
     queueAggregate -= oldFrame; 
    } 

    setAverageFps(frameLength.count()/3); // 3 seconds 
} 
+0

정확한 타이머가없고, 단지 두 번째 타이머가 없습니다. 미안 해요. OP에서 더 이상 명확하지 않았습니다. –

0

당신이 실제로 원하는 것은이 같은 것입니다) :

frames++; 
if(time<secondsTimer()){ 
    time = secondsTimer(); 
    printf("Average FPS from the last 2 seconds: %d",(frames+lastFrames)/2); 
    lastFrames = frames; 
    frames = 0; 
} 

알고 계신가요? 구조/배열 처리 방법 이 예제를 2 초가 아닌 4 초로 확장하는 것이 쉽습니다. 그러나보다 자세한 도움이 필요하면 정확한 타이머 (아키텍처, 언어)에 액세스하지 못하는 이유를 언급해야합니다. 그렇지 않으면 모든 것이 추측을 좋아해요 ...

+0

왜 정확한 타이머를 사용하지 않는지는 중요하지 않지만, 알고 싶다면이 시간에 이식 가능한 코드를 작성하고 있기 때문에 가능합니다. 저는 리눅스를 사용하고 있습니다. 사용하고있는 라이브러리는 정확한 시간에 액세스 할 수 있지만, 말했듯이이 시간에 코드를 이식 할 수 있습니다. –