嗨,我的动画中有一个简单的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 。 。
我做错了什么?
答案 0 :(得分: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
。
答案 1 :(得分: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的分数,从而提供更好的平均值。
答案 2 :(得分:0)
您正在初始化IntervalTime
,如下所示:
CurrentTime = GetTickCount();
IntervalTime = CurrentTime - PreviousTime;
但是在第一次迭代时,PreviousTime
为0.这意味着在第一次迭代时,IntervalTime
被赋予GetTickCount()
的值,这是自从PreviousTime
以来的毫秒数。系统启动了。
动画开始播放时,您需要将GetTickCount()
初始化为{{1}}。
答案 3 :(得分:0)
尝试使用timeGetTime以获得更好的计时器精度。