Winapi:GetTickCount()可以';无法获得经过的时间

Winapi:GetTickCount()可以';无法获得经过的时间,winapi,counter,elapsedtime,Winapi,Counter,Elapsedtime,嗨,我的动画中有一个简单的FPS计数器。FPS计数很好,但我不知道为什么我不能测量动画时间。通常我通过glutGet(GLUT已用时间)获得时间,但由于我必须使用Winapi,我想(或必须)使用GetTickCount()以下是我的代码: int Frames=0; int CurrentTime=0; int PreviousTime=0; int IntervalTime=0; int CounterTime=0; float FPS; void fpscount(){ Frame

嗨,我的动画中有一个简单的FPS计数器。FPS计数很好,但我不知道为什么我不能测量动画时间。通常我通过
glutGet(GLUT已用时间)
获得时间,但由于我必须使用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;

    }
}
我按行测量:
计数器时间+=间隔时间并获得奇怪的值,如:
44834406
44835420

如果我将该行定义为
CounterTime=IntervalTime+CounterTime
计数器时间
获取上述值

如果我将该行定义为
CounterTime=IntervalTime计数器时间
获取值: 1014 1014 但它们不是总和

正确的值应为: 1014 2028 . .


我做错了什么?

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

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的分数,这会得到一个更好的平均值。

你正在初始化
间隔时间
,如下所示:

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

当动画开始播放时,您需要将
PreviousTime
初始化为
GetTickCount()

尝试以下操作:

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;
    }
}

当您第一次开始处理帧时,不要忘记用当前时间初始化
以前的时间。

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

如何从上面的代码中获取特定时间?例如,在动画开始后的第三秒,fps=60.00或在第四秒,do…sth。如果您正在尝试制作动画,只需使用
GetTickCount()
,将其调整为动画的总时间,并将其除以帧数。如果你不是在谈论动画,那么我不确定你在问什么。你还需要考虑当Windows连续运行49.7天时,
GetTickCount()
将每49.7天返回0时会发生什么。请说明包装的原因,或者改用
GetTickCount64()
。您好,我已经使用了您的代码,您可以看看这个:[link]红色框中的(假)结果是我的主要问题。顺便说一句,您的代码似乎比我正在使用的代码要好:)GetTickCount不是这种计算的可靠选项。在进行优化时,将GetTickCount视为一种快速获取时间代码部分的方法。但不要依赖它来计算FPS之类的东西。它可以工作,但是调用函数的代价和精度是不够的。timeGetTime()是一个更好的选项,分辨率更好,但需要更多链接。