0

嗨,我的动画中有一个简单的 FPS 计数器。FPS算不错,但我不知道为什么我不能测量动画时间。Normaly 我得到那个时间glutGet(GLUT ELAPSED TIME)但是因为我必须去 Winapi 我想(或必须)使用GetTickCount()这是我的代码:

int Frames=0;
int CurrentTime=0;
int PreviousTime=0;
int IntervalTime=0;
int CounterTime=0;
float FPS;

void fpscount(){
    Frames++;
    CurrentTime = GetTickCount();
    IntervalTime = CurrentTime - PreviousTime;

    if(IntervalTime >= 1000)
    {
        FPS = Frames / (IntervalTime / 1000.0f);
        PreviousTime = CurrentTime;
        Frames = 0;
        CounterTime += IntervalTime;

    }
}

我按行测量:CounterTime += IntervalTime;并得到奇怪的值,例如:44834406 44835420

如果我将该行定义为上面CounterTime = IntervalTime+CounterTime;CounterTime获取值。

如果我将该行定义为CounterTime = IntervalTime;获取CounterTime值: 1014 1014 但它们没有相加。

正确的值应该是: 1014 2028 。. .

我做错了什么?

4

4 回答 4

1

试试这个:

int Frames = 0;
DWORD PreviousTime = 0;
float FPS = 0.0f;

void fpscount()
{
    Frames++;

    DWORD CurrentTime = GetTickCount();
    DWORD IntervalTime = (CurrentTime >= PreviousTime)
        ? (CurrentTime - PreviousTime)
        : ((MAXDWORD - PreviousTime) + CurrentTime);

    if (IntervalTime >= 1000)
    {
        FPS = Frames / (IntervalTime / 1000.0f);
        PreviousTime = CurrentTime;
        Frames = 0;
    }
}

并且不要忘记PreviousTime在您第一次开始处理帧时使用当前时间进行初始化。

于 2013-08-19T20:09:49.873 回答
0

我无法遵循你的思维模式,但我这样做的方式是这样的:

int gFpsStartTime;
int gFpsEndTime;
int gFpsFrames;
float gFPS;

void fpscount(){
    if (gFpsEndTime == 0) gFpsEndTime = GetTickCount();
    gFpsStartTime = GetTickCount();
    ++gFpsFrames;
    if (gFpsStartTime - gFpsEndTime > 0) {
        gFPS = gFpsFrames / ((gFpsStartTime - gFpsEndTime) / 1000.0f);
    }
}

这样做的好处是也为您提供了 FPS 的分数,从而提供了更好的平均值。

于 2013-08-19T18:49:52.997 回答
0

尝试使用timeGetTime以获得更好的计时器精度。

于 2013-08-20T10:31:51.073 回答
0

您正在IntervalTime像这样初始化:

CurrentTime = GetTickCount();
IntervalTime = CurrentTime - PreviousTime;

但是在第一次迭代中,PreviousTime为 0。这意味着在第一次迭代中,IntervalTime分配了 的值GetTickCount(),这是自系统启动以来的毫秒数。

您需要初始化动画开始播放的时间PreviousTimeGetTickCount()

于 2013-08-19T19:27:38.133 回答