Winapi:GetTickCount()可以';无法获得经过的时间
嗨,我的动画中有一个简单的FPS计数器。FPS计数很好,但我不知道为什么我不能测量动画时间。通常我通过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
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()是一个更好的选项,分辨率更好,但需要更多链接。