Jump to content

  • Log In with Google      Sign In   
  • Create Account


Problems with timeGetTime()


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 littletray26   Members   -  Reputation: 267

Like
0Likes
Like

Posted 17 November 2012 - 10:39 PM

Hey GameDev

I am trying to make my game run based off the delta between 2 frames, so that it will run the same speed on every computer.

I am trying to get the delta between 2 frames like this:

static DWORD lastFrameTime;
static DWORD frameDelta;
frameDelta = timeGetTime() - lastFrameTime;
d3dDevice->Clear(0, 0, D3DCLEAR_TARGET, 0x000000, 1, 0);
d3dDevice->BeginScene();
d3dSpriteMachine->Begin(D3DXSPRITE_ALPHABLEND);
Draw(sprite, frameDelta);
d3dSpriteMachine->End();
d3dDevice->EndScene();
d3dDevice->Present(NULL, NULL, NULL, NULL);
Update(mousePosition, frameDelta);
lastFrameTime = timeGetTime();

The problem is that the delta always ends up 0, or at most, 1. I tried stepping through the code and I find that when lastFrameTime is set to timeGetTime() at the end, then on the next frame the time is the same. What I mean, is that it appears to be run through one frame on say 123342342 (this is just an example) and then on the second frame, timeGetTime returns 123342342 again so the delta is set to 0. I'm obviously missing something. Any help? haha
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky :)

Sponsor:

#2 Hodgman   Moderators   -  Reputation: 26958

Like
1Likes
Like

Posted 17 November 2012 - 10:49 PM

You shouldn't be calling timeGetTime twice per frame like that -- the result of that code is that you're not timing your Draw/Update code at all, you're only timing the code that comes between the bottom line and the top line.
You can change it to only call timeGetTime once per frame like this:
static DWORD lastFrameTime = 0;
DWORD frameDelta;
DWORD thisFrameTime = timeGetTime();
if( lastFrameTime == 0 )//first frame!
  frameDelta = 0;
else
  frameDelta = thisFrameTime - lastFrameTime;
lastFrameTime = thisFrameTime;
//DoStuff

P.S. timeGetTime isn't very accurate, so most people use QueryPerformanceCounter/QueryPerformanceFrequency instead, or you can use someone else's ready-made high accuracy timer, such as timer_lib.

Edited by Hodgman, 17 November 2012 - 10:51 PM.


#3 littletray26   Members   -  Reputation: 267

Like
0Likes
Like

Posted 17 November 2012 - 10:51 PM

You shouldn't be calling timeGetTime twice per frame like that -- the result of that code is that you're not timing your Draw/Update code at all, you're only timing the code that comes between the bottom line and the top line.
You can change it to only call timeGetTime once per frame like this:

static DWORD lastFrameTime;
static DWORD frameDelta;
DWORD thisFrameTime = timeGetTime();
frameDelta = thisFrameTime - lastFrameTime;
lastFrameTime = thisFrameTime;
//DoStuff

P.S. timeGetTime isn't very accurate, so most people use QueryPerformanceCounter/QueryPerformanceFrequency instead, or you can use someone else's ready-made high accuracy timer, such as timer_lib.


Thank you, but I'm not sure I understand. What exactly is the problem? And why shouldn't I call TimeGetTime twice?

Thanks :)
The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky :)

#4 Hodgman   Moderators   -  Reputation: 26958

Like
0Likes
Like

Posted 17 November 2012 - 10:59 PM

You're measuring the time from the end of frame#1 to the beginning of frame #2.
A = get the time.
...spend a while doing stuff...
B = get the time
...loop for next frame...
C = get the time
time spent doing stuff previously = C-B  (wrong)
...spend a while doing stuff...
etc

You really want to be measuring the time from the start of frame#1 to the start of frame#2.
A = get the time.
...spend a while doing stuff...
...loop for next frame...
B = get the time
time spent doing stuff previously = B-A
...spend a while doing stuff...
etc

Edited by Hodgman, 17 November 2012 - 11:01 PM.


#5 littletray26   Members   -  Reputation: 267

Like
0Likes
Like

Posted 17 November 2012 - 11:06 PM

You're measuring the time from the end of frame#1 to the beginning of frame #2.

A = get the time.
...spend a while doing stuff...
B = get the time
...loop for next frame...
C = get the time
time spent doing stuff previously = C-B  (wrong)
...spend a while doing stuff...
etc

You really want to be measuring the time from the start of frame#1 to the start of frame#2.
A = get the time.
...spend a while doing stuff...
...loop for next frame...
B = get the time
time spent doing stuff previously = B-A
...spend a while doing stuff...
etc


I think I understand you now.

Is this better?

static DWORD lastFrameTime;
static DWORD frameDelta;
static DWORD thisFrameTime;
thisFrameTime = timeGetTime();
if (lastFrameTime == 0)
  frameDelta = 0;
else
frameDelta = thisFrameTime - lastFrameTime;
lastFrameTime = thisFrameTime;
d3dDevice->Clear(0, 0, D3DCLEAR_TARGET, 0x000000, 1, 0);
d3dDevice->BeginScene();
d3dSpriteMachine->Begin(D3DXSPRITE_ALPHABLEND);
Draw(sprite, frameDelta);
d3dSpriteMachine->End();
d3dDevice->EndScene();
d3dDevice->Present(NULL, NULL, NULL, NULL);
Update(mousePosition, frameDelta);

The majority of Internet Explorer users don't understand the concept of a browsing application, or that there are options.
They just see the big blue 'e' and think "Internet". The thought process usually does not get much deeper than that.

Worms are the weirdest and nicest creatures, and will one day prove themselves to the world.

I love the word Clicky :)

#6 yckx   Prime Members   -  Reputation: 1163

Like
0Likes
Like

Posted 18 November 2012 - 12:49 PM

You should initialize lastFrameTime to 0, otherwise there's no reason to expect it will actually be 0 for the first frame. Also, there is no reason for thisFrameTime and frameDelta to be static. You're refiguring them each loop. The reason lastFrameTime needs to be static is that you need to know it's value from the previous iteration.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS